스프링 빈

가언·2024년 7월 17일

spring

목록 보기
2/8

✅ 스프링 빈으로 등록해줘!

[의미]

: 이 클래스 만들어뒀으니까,
객체를 만들어서, 컨테이너에 넣어서 니가 관리해줘

[실습] class House

과정

  1. Spring 컨테이너 시작: 스프링 애플리케이션이 시작되면 스프링 컨테이너가 초기화

  2. 컴포넌트 스캔: 난 스프링 애노테이션을 붙은 코드만 다 읽는다! 스프링 컨테이너는 컴포넌트 스캔(Component Scanning)을 통해 @Component 애노테이션이 붙은 클래스를 찾아 빈으로 등록

  1. 빈 생성: @Component 애노테이션이 붙은 클래스를 발견하면, 스프링 컨테이너는 해당 클래스의 객체를 생성하고, 이때 클래스의 기본 생성자가 호출

  2. 생성자 호출: House 클래스의 생성자가 호출되면서 System.out.println("Created! House Bean!");가 실행되고, 이 메시지가 콘솔에 출력

component scan 설정

  • xml파일-> @annotation으로 component scan설정이 가능하게 함.

  • xml 파일 형식이 자바 객체 지향 파일로 변환됨

  • application.java와 다른 패키지에 존재하면, component scan으로 인한 객체 생성이 되지 않음

    • application annotation은 최상단에 위치해야 한다.
    • 이유: @SpringBootApplication이 붙은 클래스가 기둥이 되어 같은 패키지 내에 있는 클래스만 훑어보기 때문
  • 문자열이 위험한 이유: 문자열에 오타가 나도 스프링이나 자바는 알지 못하기 때문이다.

스프링이 어떻게 알고, buy B House가 출력된걸까?

1️⃣번 방법

✅ Person, House

  1. 누가 먼저 스프링 빈이 되나요?
    House, House가 있어야 Person생성이 되기 때문이다.

  2. 스프링은 뭘 보고 Person이 필요한 House를 쏙 넣어줬을까요?
    다른 객체 넣어줄 수도 있잖아!
    스프링 빈은 타입으로 구별된다!

  3. 우린 스프링한테 House 객체가 필요하니깐 넣어줘!
    라고 얘기한 적이 있나요?
    생성자가 1개일 때, @Autowired 어노테이션이 생략되어 있기 때문에! 우리는 얘기했다..!!

2️⃣번 방법

DI 방법은 사실 3가지

  1. 필드로 주입 받음
    @Autowired
    : 필드 마련
  2. Setter로 주입 받음
    @Autowired
    :public setter메소드
  3. 생성자로 주입 받음:
    @Autowired
    :생성자
    클래스에 컴포넌트에 될 생성자에 생성자가 하나밖에 없으면, @Autowired가 생략되어 있음.
    스프링 매개변수로 객체줘야하는데 객체관리는 니가 하잖아 적당한 걸로 너가 넣어줘!!
    스프링은 타입으로 구별하고, 타입을 보고 객체를 넣어줌
    생각할 거리) 그렇다면, Home 인터페이스를 implements한 Apart, Villa 객체가 있다면, 누구를 넣어줘야 할까?

[방법]

1️⃣. @Component : 밑에 따라오는 요소까지 영향력을 끼침. class, field, method

2️⃣. @Configuration = 설정 파일
+@Bean
클래스 위에서 사용하며, 이 클래스는 내가 설정파일로 쓸거야 xml대신에 자바코드로 구현할거야! 그러니깐 개발자 너는 설정파일로 이걸 봐야해!
Configuration파일 있고, Bean annotation을 넣어준다면 스프링 빈으로 등록할 수도 있다!라는 의미

(@Configuratio은 안에 Component가 있어야 한다. 알아봐야하기 때문에
@Component는 spring이 알아볼 수 있다!)

✅ @Configuration

스프링아 이어노테이션이 달려있는 클래스는 구현 용도가 아니라, 설정 용도야!
즉 xml, 대신 쓴거야!
그래서~ 설정 용도 중 스프링 등록도 있어!
객체를 반환하는 메소드 위에 @Bean을 달면, 반환되는 객체를 스프링 빈으로 등록

✅ 컨테이너

profile
@gari_guri

0개의 댓글