본문 바로가기

Spring

Spring @Configuration @Bean 스프링 빈 등록 방법

728x90
반응형
프로그램으로 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메타 어노테이션으로 설정한다. 

그러면 어플리케이션 시작시간을 줄일 수 있다.

 

728x90
반응형