프로그램으로 Spring Bean 설정시 @Configuration, @Bean 어노테이션을 이용할 수 있다.
클래스에 @Configuration을 설정하면 Class안애 @Bean메서드가 1개 이상 있어야하고 메서드는 빈 인스턴스를 생성해 반환한다. 스프링 컨테이너는 @Bean을 설정한 메서드가 반환하는 인스턴스를 관리한다.
@Configuration
public class TestAppConfiguration{
@Bean(name="testAppService")
public TesetAppService testAppService() {
return new TestAppServiceImpl();
}
}
@Bean에 설정한 name 속성은 스프링 컨테이너에 등록할 때 사용하는 빈이름이다.
<bean id="testAppService" class="com.example.test.service.TestAppServiceImpl"/>
XML파일에 위와 같이 정의하는 것과 같은 효과가 있다.
@Configuration 클래스를 사용하려면 CGLIB가 필요하다. 클래스 확장으로 @bean을 설정한 메서드에 행동을 추가한다.
CGLIB가 하위 클래스를 만들어야 하므로 @Configuration class는 final로 정의하면 안되고 인수가 없는 생성자를 제공해야한다.
CGLIB란?
코드 생성 라이브러리(Code Generator Library) 런타임에 동적으로 자바 class의 프록시를 생성해주는 기능을 제공한다.
기존 코드를 변경하지 않고 기능을 추가할 수 있는 프록시 기술을 구현한 방법중 하나이다.
Dynamic Proxy가 인터페이스를 통해 구현해야하지만 CGLib는 인터페이스가 아닌 클래스에 대해 동적 프록시를 생성할 수 있어서 널리 쓰이고 있다. 하이버네이트와 스프링에서 사용하고 있다.(Spring AOP)
@Component, @Named 설정한 클래스 안에서 @Bean정의
@Service
public class TestAppServiceImpl implements TestAppService {
@Autowired
private TestAppDao testAppDao;
@Override
public String getTestAppName(long id) {
return testAppDao.getTestAppName(id);
}
@Bean
public TestAppDao testAppDao() {
return new TestAppDaoImpl();
}
}
TestAppServiceImpl은 @Autowired를 통해 TestAppDaoImpl인스턴스를 자동 연결한다.
그러나 @Service 클래스 내부에 @Bean설정한 메서드를 정의하면 다른 일반 메서드처럼 우연히 호출할 가능성이 있다.
이런 문제로 인해 @Bean을 설정한 메서드를 정의하고 싶을 때는 @Configuration클래스 사용을 권장한다.
@ComponentScan 빈등록 검색
@Configuration 어노테이션을 통해 설정한 클래스는 @ComponentScan을 통해 빈으로 등록할 수 있다.
@Configuration
@ComponentScan(basePackages = "com.example")
public class TestBean{
...
}
excludeFilters와 includFilters속성이 있다.
@Indexed 컴포넌트 인덱스 사용
스프링5에서 새로생긴 spring-context-indexer 모듈을 이용하면 Spring Component 인덱스를 생성하는 기능을 추가할 수 있다. 애플리케이션이 시작할 때 생성된 인덱스를 통해 스프링 컴포넌트를 로드한다.
@Indexed를 설정한 클래스를 모두 인덱스에 넣는다.
@Configuration과 @Component에는 @Indexed메타 어노테이션으로 설정한다.
그러면 어플리케이션 시작시간을 줄일 수 있다.
'Spring' 카테고리의 다른 글
Spring @Valid 어노테이션으로 파라미터 검증하기 (0) | 2022.02.02 |
---|---|
Spring boot + mariadb + mybatis + hikaricp 설정 (0) | 2022.02.02 |
스프링 빈 라이프 사이클(Spring Bean Life Cycle) (0) | 2022.01.30 |
Spring ResourceHttpRequestHandler (0) | 2022.01.28 |
Spring MVC 동작 방식 (DispatcherServlet) (0) | 2022.01.27 |