@Qualifier
를 파라미터에 추가해도 된다.@Bean public Printer printer() { return new Printer(); } @Bean public Hello hello(Printer printer) { // 위에 선언된 printer Bean이 주입됨. ... hello.setPrinter(printer); }
Java Config용 클래스에 @Configuration
을 붙이지 않으면 @Bean
애노테이션된 메소드에 의한 객체 생성시 싱글턴이 보장되지 않는다.
또한 동일 설정 클래스에서 생성한 다른 Bean의 @Autowired
주입도 안 된다.
Bean에 주입할 객체를 @Bean
으로 생성하지 않고 바로 new로 생성하여 주입하면 Spring의 InitializingBean과 같은 인터페이스를 구현한 것이 정상적으로 호출되지 않아 문제가 될 수 있다.
예)
// WebMVC의 코드 중 일부 // 아래 코드에서 openEntityManagerInViewIterceptor는 BeanFactoryAware 인터페이스를 구현하고 있지만 // 해당 기능이 제대로 작동하지 않게 된다. OpenEntityManagerInViewInterceptor openEntityManagerInView = new OpenEntityManagerInViewInterceptor(); openEntityManagerInView.setEntityManagerFactory(entityManagerFactory); // ApplicationContext를 주입받아서 OEMIV 객체에 직접 주있해줬음. // 단, 항상 entityManagerFactory를 먼저 주입하고 다은에 applicationContext 주입할 것. // 안그러면 EMF가 여러개일 때 Autowiring 오류가 발생함. // 가장 좋은 것은 OEMIV를 직접 빈(''@Bean'')으로 생성하는 것.
@Component
, @Bean
과 함께 지정.
XxxJavaConfig
클래스와 YyyJavaConfig
가 서로가 생성하는 객체를 주입받으려고 하면 문제가 된다.
현재 확인된 바로는 무한 루프를 도는 듯한 상황이 연출되었다.
이런 상황은 만들지 말 것.
@Value
로 주입하는 값이, 동일 설정 파일의 @Bean
을 통해 생성된 Properties
객체의 값일 때 Circular Dependency가 발생할 수도 있다.@Configuration public class SomePropsConfig { @Value("#{myProperties['myprops.someValue']}") private int someValue; public Properties myProperties() { return new Properties() ..... } }
SomePropsConfig
객체를 가진 설정파일보다 다른 설정파일이 먼저 로딩됨.SomePropsConfig
객체를 가진 설정파일에 있는 또 다른 제3의 Bean에 의존함.SomePropsConfig
객체를 생성하면서 먼저 Field Injection을 시도하고 그 뒤에 @Bean
을 생성하는데, Field가 동일 설정 파일의 @Bean myProperties
객체에 의존하는 상황.private List<DataSource> dataSources; // 모든 DataSource Bean 목록 주입 private Map<String, DataSource> dataSourcesByBeanName; // beanName 을 key로 하여 모든 DataSource bean 주입