❯ AnnotationConfigApplicationContext 를 사용해 스프링 컨테이너를 인스턴스화 하는 방법
ApplicationContext는 아래 애너테이션이 달린 클래스를 파라미터로 전달받는다.
(@Configuration, @Component, JSR-330 메타데이터)
@Configuration 클래스가 입력으로 제공되면 해당 클래스 자체가 Bean 의 정의로 등록되고, 클래스 내에서 선언된 모든 @Bean 메서드도 Bean 의 정의로 등록된다.
@Component 클래스와 JSR-330 클래스가 제공되면 Bean 정의로 등록되며 필요한 경우 해당 클래스 내에서 @Autowired 또는 @Inject와 같은 DI 메타데이터가 사용되는것으로 가정한다.
❯ @Bean 애너테이션 사용
@Bean은 메서드 레벨의 애너테이션으로 @Configuration-annoted 또는 @Component-annoted 클래스에서 사용 가능하다.
@Bean 애너테이션이 추가된 메서드는 빈을 구축하는데 필요한 매개변수를 인자로 지정하여 의존성을 나타낼 수 있다.
- 애너테이션 방식의 configuration
@Configuration
public class DependencyConfig {
@Bean
public TransferServiceImpl transferService() {
return new TransferServiceImpl();
}
}
- 빈 정의가 있는 인터페이스를 구현하여 Bean configuration 설정
public interface BaseConfig {
@Bean
default TransferServiceImpl transferService() {
return new TransferServiceImpl();
}
}
@Configuration
public class DependencyConfig implements BaseConfig {
}
@Configuration 애너테이션 사용
@Configuration 은 해당 객체가 Bean definitions의 소스임을 나타내는 애너테이션이다.
@Bean-annoted 메서드를 통해 Bean을 선언한다.
❯ Bean 사이에 의존성 주입
빈이 서로 의존성을 가질 때, 생성자 주입을 통해 표현할 수 있다.
@Configuration
public class DependencyConfig {
@Bean
public BeanOne beanOne() {
return new BeanOne(beanTwo());
}
@Bean
public BeanTwo beanTwo() {
return new BeanTwo();
}
}
❯ 애너테이션을 사용해 스프링 컨테이너를 구성하는 방법
@Import 애너테이션 : 구성을 모듈화 하는데 사용되며 다른 구성클래스에서 @Bean definitions 을 가져올 수 있다.
@Configuration
public class DependencyConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(DependencyConfigA.class)
public class DependencyConfigB {
@Bean
public B b() {
return new B();
}
}
보통 Bean은 1개의 구성파일만 import 하지 않고 여러 구성클래스간에 서로 의존성을 가진다.
@Configuration 클래스를 사용하면 자바 컴파일러는 구성 모델에 제약을 둔다. 다른 Bean에 대한 참조는 반드시 유효한 구문이어야 한다.
❯ Component Scan
설정 정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.
수작업으로 작업하게되면 누락되거나 설정정보가 커지는 문제가 발생하는데, @ComponentScan을 통해 이를 해결할 수 있다.
@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록해준다.
(@Configuration이 붙은 설정정보도 자동으로 등록되는데, 이는 @Configuration에 @Component애너테이션이 붙어있기 때문이다.)
참고자료 : 스프링 공식 문서
'부트캠프 개발일기 > Spring' 카테고리의 다른 글
39일차: Spring Framework(Advice, JoinPoint) (0) | 2023.04.07 |
---|---|
38일차: Spring Framework(AOP) (0) | 2023.04.07 |
36일차: Spring Framework (DI, Spring Container, Bean) (0) | 2023.04.04 |
35일차: Architecture, Spring Boot (0) | 2023.04.03 |
34일차: Spring Framework (0) | 2023.04.02 |