2017-10-23 3 views
-1

스프링에서 자바 설정을 사용하고 있습니다. 목표는 BeanFactoryPostProcessor의 단계에서 beanDefinion 클래스를 대체하는 것입니다.스프링 자바 설정과 BeanFactoryPostProcessor

I'v은 빈

@Bean 
public User user() { 
    CustomUser user = new CustomUser(); 
    user.setName("UserA"); 
    return user; 
} 

새로운 클래스 "NewTypeOfCustomUser"를 얻고 NewTypeOfCutsomUser하여 CustomUser를 교체하고 싶습니다.

이전에 사람이 XML 구성을 사용 중일 때이를 수행하는 예를 보았습니다.

BeanDefinition.setBeanClassName 

메서드를 사용하여 수행됩니다. 그러나 BeanFactoryPostProcessor의 작업 단계에서 내 케이스의 beanDefinition 클래스는 null입니다. Java Config는 XML 구성과 완전히 다른 방식으로 작동합니다.

제 질문은 자바 구성을 사용하여이 절차를 수행 할 수 있습니까?

답변

0

사용자의 요구 사항을 이해하는 한 CustomUser의 인스턴스 유형을 NewTypeOfCustomUser으로 변경하려고합니다. XML 설정을 사용하면 사용자가 명시한대로 BeanFactoryPostProcessor을 사용하여이 작업을 수행 할 수 있습니다. 자바 설정으로, 당신이 찾고있는 것은 user() bean 메소드의 실제 코드를 수정하는 것이고 그것은 가능하다고 생각하지 않는다.

BeanPostProcessor을 사용하면 선언에서 BeanFactoryPostProcessor이 아닌 beans 인스턴스에서 직접 작동하고 필요한 bean의 인스턴스를 수정할 수 있습니다. 당신이 할 수있는 일의 예를 따르는 것은 :

public class CustomUserBeanPostProcessor implements BeanPostProcessor { 

    public CustomUserBeanPostProcessor() { 
     System.out.println("CustomUserBeanPostProcessor constructor called"); 
    } 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) 
      throws BeansException { 
     System.out.println("postProcessBeforeInitialization method invoked"); 
     System.out.println(bean.getClass() + " " + beanName); 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) 
      throws BeansException { 
     System.out.println("postProcessAfterInitialization method invoked"); 
     System.out.println(bean.getClass() + " " + beanName); 
     if (bean instanceof User) { 
      bean = new NewTypeOfCustomUser((User) user); 
     } 
     return bean; 
    } 
} 

이것은 또한 당신이 CustomUser 매개 변수를 받아 여러분의 필요에 따라 데이터를 관리하는 NewTypeOfCustomUser에 생성자를 추가해야합니다.

+0

예, 그렇게 할 수 있습니다. 그러나 제 목표는이 일을하는 또 다른 방법을 찾지 않고 배우는 것입니다. 커스텀 @DeprecatedCustom (newImplementation = NewImplementation.class) 주석을 구현하고 싶습니다. 내 Custom BeanFactoryPostProcessor는 beanDefinition의 클래스가 해당 주석에 의해 주석을 달고 있는지 확인하고, 사용 중지 된 beanDefinition 클래스를 대체하는지 확인합니다. –