목차

Springframework Java Config

컨텍스트 클래스

메소드 인자를 통한 주입 받기

@Bean
public Printer printer() {
    return new Printer();
}
 
@Bean
public Hello hello(Printer printer) { // 위에 선언된 printer Bean이 주입됨.
   ...
   hello.setPrinter(printer);
}

@Primary

주의할 점

Java Config 클래스는 무조건 @Configuration 애노테이션을 붙인다

Java Config용 클래스에 @Configuration을 붙이지 않으면 @Bean 애노테이션된 메소드에 의한 객체 생성시 싱글턴이 보장되지 않는다.

또한 동일 설정 클래스에서 생성한 다른 Bean의 @Autowired 주입도 안 된다.

Spring의 특정 인터페이스를 구현했을 경우 처리

Bean에 주입할 객체를 @Bean으로 생성하지 않고 바로 new로 생성하여 주입하면 Spring의 InitializingBean과 같은 인터페이스를 구현한 것이 정상적으로 호출되지 않아 문제가 될 수 있다.

예)

// WebMVC의 코드 중 일부
// 아래 코드에서 openEntityManagerInViewIterceptor는 BeanFactoryAware 인터페이스를 구현하고 있지만
// 해당 기능이 제대로 작동하지 않게 된다.
OpenEntityManagerInViewInterceptor openEntityManagerInView = new OpenEntityManagerInViewInterceptor();
openEntityManagerInView.setEntityManagerFactory(entityManagerFactory);
 
// ApplicationContext를 주입받아서 OEMIV 객체에 직접 주있해줬음.
// 단, 항상 entityManagerFactory를 먼저 주입하고 다은에 applicationContext 주입할 것.
// 안그러면 EMF가 여러개일 때 Autowiring 오류가 발생함.
// 가장 좋은 것은 OEMIV를 직접 빈(''@Bean'')으로 생성하는 것.

@DependsOn

Java Config간의 상호 의존

XxxJavaConfig 클래스와 YyyJavaConfig가 서로가 생성하는 객체를 주입받으려고 하면 문제가 된다. 현재 확인된 바로는 무한 루프를 도는 듯한 상황이 연출되었다. 이런 상황은 만들지 말 것.

하나의 JavaConfig 안에서 Field를 통한 Properties 주입과 @Bean Properties 의 상호 의존

BeanFactoryPostProcessor

Bean의 List/Map 주입받기

private List<DataSource> dataSources; // 모든 DataSource Bean 목록 주입
private Map<String, DataSource> dataSourcesByBeanName; // beanName 을 key로 하여 모든 DataSource bean 주입