카테고리 없음

Spring-@Autowired를 얻기 전에 bean에 필드를 삽입하십시오.

기록만이살길 2021. 2. 26. 09:20
반응형

Spring-@Autowired를 얻기 전에 bean에 필드를 삽입하십시오.

1. 질문(문제점):

Spring에는 특정 어노테이션으로 어노테이션이있는 Bean이 @Autowired사용자 정의 로직을 가져 오고 실행 하는시기를 감지하는 메커니즘 또는 리스너가 있습니까? @ConfigurationProperties자동 연결되기 전에 자동으로 필드를 주입하는 것과 유사한 것 입니다.

@ExampleAnnotation인스턴스화되기 전에 주석이 달린 특정 빈의 필드에 값을 주입해야하는 요구 사항이 있습니다. 이상적으로는이 청취자에서 다음을 수행합니다.

  1. 인스턴스화되는 현재 Bean에 주석이 추가되었는지 묻습니다. @ExampleAnnotation
  2. 그렇지 않은 경우 반환하십시오. 그렇다면 리플렉션을 사용하여이 빈에서 필드 이름을 가져오고 저장소를 사용하여 채 웁니다.

이와 같은 것이 가능합니까?

2. 해결방안:

다음 코드를 사용하여 얻을 수 있습니다.

@Component
class MyBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      // Every spring bean will visit here

      // Check for superclasses or interfaces
      if (bean instanceof MyBean) {
        // do your custom logic here
        bean.setXyz(abc);
        return bean;
      }
      // Or check for annotation using applicationContext
      MyAnnotation myAnnotation = this.applicationContext.findAnnotationOnBean(beanName, MyAnnotation.class);
      if (myAnnotation != null) {
        // do your custom logic here
        bean.setXyz(myAnnotation.getAbc());
        return bean;
      }
      return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      this.applicationContext = applicationContext;
    }

    // Optional part. If you want to use Autowired inside BeanPostProcessors 
    // you can use Lazy annotation. Otherwise they may skip bean processing
    @Lazy
    @Autowired
    public MyBeanPostProcessor(MyLazyAutowiredBean myLazyAutowiredBean) {
    }
}
65797367
반응형