카테고리 없음
Spring-@Autowired를 얻기 전에 bean에 필드를 삽입하십시오.
기록만이살길
2021. 2. 26. 09:20
Spring-@Autowired를 얻기 전에 bean에 필드를 삽입하십시오.
1. 질문(문제점):
Spring에는 특정 어노테이션으로 어노테이션이있는 Bean이 @Autowired사용자 정의 로직을 가져 오고 실행 하는시기를 감지하는 메커니즘 또는 리스너가 있습니까? @ConfigurationProperties자동 연결되기 전에 자동으로 필드를 주입하는 것과 유사한 것 입니다.
@ExampleAnnotation인스턴스화되기 전에 주석이 달린 특정 빈의 필드에 값을 주입해야하는 요구 사항이 있습니다. 이상적으로는이 청취자에서 다음을 수행합니다.
- 인스턴스화되는 현재 Bean에 주석이 추가되었는지 묻습니다.
@ExampleAnnotation
- 그렇지 않은 경우 반환하십시오. 그렇다면 리플렉션을 사용하여이 빈에서 필드 이름을 가져오고 저장소를 사용하여 채 웁니다.
이와 같은 것이 가능합니까?
2. 해결방안:
다음 코드를 사용하여 얻을 수 있습니다.
@Component
class MyBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof MyBean) {
bean.setXyz(abc);
return bean;
}
MyAnnotation myAnnotation = this.applicationContext.findAnnotationOnBean(beanName, MyAnnotation.class);
if (myAnnotation != null) {
bean.setXyz(myAnnotation.getAbc());
return bean;
}
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Lazy
@Autowired
public MyBeanPostProcessor(MyLazyAutowiredBean myLazyAutowiredBean) {
}
}
65797367