Spring이 Singleton Bean을 구현하는 방법

다음 예제에서 dataSource 메소드는 두 번 호출되는 bean입니다. 그러나 우리는 Bean이 Spring에서 기본적으로 싱글톤이라는 것을 알고 있습니다(아래 링크 참조).






@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        return new JdbcDataSource();
    }

    @Bean
    public DevRepository devRepository() {
        JdbcDevRepository repository = new JdbcDevRepository(dataSource);
        repository.setDataSource(dataSource());
        return repository;
    }

    @Bean
    public ProdRepository prodRepository() {
        JdbcProdRepository repository = new JdbcProdRepository();
        repository.setDataSource(dataSource());
        return repository;
    }
}

시작 시 하위 클래스는 cglib(코드 생성 라이브러리)를 사용하여 생성됩니다. bean의 첫 번째 호출에서만 super를 호출하고 애플리케이션 컨텍스트에 의해 하나의 인스턴스가 캐시되고 하위 클래스가 진입점입니다.

@Configuration
public class AppConfig$$EnhancerByCGLIB$ extends AppConfig{
...
}

그러나 cglib는 생성자가 있는 클래스를 지원하지 않으므로(Spring 4.3부터 autowired 생성자가 가능합니다. 참조) Spring은 이제 이를 극복하기 위해 objenesis을 사용합니다.


좋은 웹페이지 즐겨찾기