2016-10-03 3 views
1

Ich mache eine BeanPostProcessor-Implementierung. Mein Bean PostProcessor wird 3 mal ausgeführt. Ich bekomme Post-Prozessor 2 mal extra vor Init-Methode aufgerufen. Ich kann nicht herausfinden, warum es passiert. Bitte hilf mir.Spring BeanPostProcessor aufgerufen 3 Mal

Mein Code und Konfigurationsdateien sind als

BeanPostProcesssor implementatin

public class BeanPP implements BeanPostProcessor{ 

    @Override 
    public Object postProcessBeforeInitialization(Object o, String string) throws BeansException { 
     System.out.println("---before initialization ------"); 
     return o; 
     //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object o, String string) throws BeansException { 
     System.out.println("----After initializaion ---- "); 
     return o; 
     //To change body of generated methods, choose Tools | Templates. 
    }   
} 

Kunden Bean

public class Customer {   
    private String name; 

    public String getName() { 
     System.out.println("..getName....."); 
     return name; 
    } 

    public void setName(String name) { 
     System.out.println("..setName....."); 
     this.name = name; 
    } 

    @PostConstruct 
    public void init(){ 
     System.out.println("....Bean is going though init method"); 
    } 

    @PreDestroy 
    public void destory(){ 
     System.out.println("....Bean is going to destroy......."); 
    } 
} 

Konfiguration Klasse

@Configuration 
public class AppConfig { 
    @Bean(name="customer") 
    public Customer getCustomer(){ 
     return new Customer(); 
    } 
    @Bean 
    public BeanPP getPP(){ 
     return new BeanPP(); 
    } 

} 

Hauptklasse

public class MainApp { 

    public static void main(String[] args) { 
     ApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class); 
     Customer customer = (Customer)appContext.getBean("customer"); 
     customer.setName("test user "); 
     System.out.println(".Name is .."+customer.getName()); 
    } 
} 

Ausgabe

--- vor der Initialisierung ------ ---- Nach initializaion ---- --- vor der Initialisierung ------ ---- Nach der Initialisierung ---- --- vor der Initialisierung ------ .... Bean geht init Methode ---- Nach initializaion ---- ..setName ..... ..getName ..... .Name ist ..test Benutzer

+0

Sie haben 3 Bohnen und es wird für sie alle heißen. Sie haben 'AppConfig',' Kunden' und 'BeanPP' alle 3 davon sind Bohnen. –

Antwort

2

Plain Bohne Fabriken ermöglichen programmatische Registrierung von Postprozessoren, alle Bohnen durch diese Fabrik erstellt die Anwendung.

http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html

Sie haben 3-Bohnen definiert, AppConfig, Kunden- und PP. Der Bean-Post-Prozessor wird nach jeder Bean-Erstellung ausgeführt. Wenn Sie 3 Bohnen haben, wird es 3 mal ausgeführt.

@Configuration 
public class AppConfig { 
    @Bean(name="customer") 
    public Customer getCustomer(){ 
     return new Customer(); 
    } 
    @Bean 
    public BeanPP getPP(){ 
     return new BeanPP(); 
    } 
} 

@Configuration auch eine Bean definieren, da es von @Component Vererbung.

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

+0

Hallo Reos, Danke ich habe deinen Standpunkt. Danke für das Formatieren meines Codes. Es war mein erster Code. Entschuldigung für Unannehmlichkeiten. – brai

0

Können Sie in postProcessBeforeInitialization setzen auch auszudrucken die Object o Klasse, nur um zu sehen, welche Klasse den BeanPostProcessor aufruft (es kann nicht die Customer Klasse sein, aber ein anderes Objekt, das Spring initiiert, sogar der BeanPostProcessor selbst).

@Override 
public Object postProcessBeforeInitialization(Object o, String string) throws BeansException { 
    System.out.println("---before initialization ------ " + o..getClass().getName()); 
    return o; 
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 
Verwandte Themen