2017-10-23 1 views
-1

Ich verwende Java-Konfigurationen im Frühjahr. Das Ziel ist es, die BeanDefinion-Klasse auf einer Stufe von BeanFactoryPostProcessor zu ersetzen.Spring Java-Konfigurationen und BeanFactoryPostProcessor

I'v bekam eine Bohne

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

und eine neue Klasse "NewTypeOfCustomUser" und möchte die CustomUser durch NewTypeOfCutsomUser ersetzen.

Bevor ich ein Beispiel dafür gesehen habe, als ein Typ auf XML-Konfigurationen war. Es wird unter Verwendung von

BeanDefinition.setBeanClassName 
Verfahren durchgeführt. Allerdings ist die Klasse von beanDefinition in meinem Fall auf der Ebene von BeanFactoryPostProcessor null. Es scheint, dass Java Config auf eine völlig andere Art und Weise als XML-Configs funktioniert.

Also meine Frage: Ist es möglich, diese Prozedur mit Java-Konfigurationen zu tun?

Antwort

0

Soweit ich verstehe, was Ihre Anforderungen sind, möchten Sie den Typ der Instanz von CustomUser mit NewTypeOfCustomUser ändern. Mit der von Ihnen angegebenen XML-Konfiguration kann dies unter Verwendung der erreicht werden. Mit Java-Konfiguration, was Sie suchen, ist es, den tatsächlichen Code der user() Bean-Methode zu ändern, und ich glaube nicht, dass es machbar ist.

Sie können eine BeanPostProcessor verwenden, die direkt auf den Beans-Instanzen und nicht auf der Deklaration als BeanFactoryPostProcessor ausgeführt wird, und die Instanz der erforderlichen Bean ändern. Im Anschluss an ein Beispiel von dem, was Sie tun können:

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; 
    } 
} 

Dies erfordert auch, dass Sie einen Konstruktor zum NewTypeOfCustomUser hinzufügen, die eine CustomUser Parameter akzeptiert und die Daten entsprechend Ihren Bedürfnissen verwalten.

+0

Ja, ich könnte es so machen. Aber mein Ziel ist es zu lernen, nicht einen anderen Weg zu finden, dies zu tun. Ich möchte benutzerdefinierte Annotation @DeprecedCustom (newImplementation = NewImplementation.class) implementieren. Was mein benutzerdefinierter BeanFactoryPostProcessor tun muss, ist zu überprüfen, ob die Klasse einer BeanDefinition durch diese Annotation mit Anmerkungen versehen ist, und wenn ja, dann ersetze die veraltete BeanDefinition-Klasse –

Verwandte Themen