2016-06-06 21 views
-1

Betrachten wir einen Code:Warum Felder automatisch über autowireCapableBeanFactory ohne Verzögerung autowire?

public class MyClass { 
    @Autowired 
    private SomeInterface variable; 

    public void init(ServletContext servletContext) { 
     WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); //debug point here 
     context.context.getAutowireCapableBeanFactory().initializeBean(this, getClass().getSimpleName()); 
    } 
} 

Wenn ich bleibe bei Debug autowiring normalen führt, aber wenn ich Debug-Punkt weggeräumt habe ich NPE bei variable. Es scheint, dass Spring autowiring asynchron ausführt. Gibt es eine Möglichkeit sicherzustellen, dass alle Felder initialisiert werden?

Hinweis

Ja initializeBean(this, getClass().getSimpleName()) rufe dies ist nicht eine bewährte Methode der Frühlings-Nutzung, aber ich habe keine andere Art und Weise, weil Klasse in anderer Bibliothek instanziiert die Feder nicht verwendet hat.

+1

Sie sollten 'SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this);' anstelle von 'initializeBean' verwenden. –

Antwort

0

Wie in Kommentaren erwähnt, ist es besser SpringBeanAutowiringSupport statt AutowireCapableBeanFactory zu verwenden.

import org.springframework.beans.factory.annotation.Configurable; 
import org.springframework.web.context.support.SpringBeanAutowiringSupport; 

@Configurable 
public class MyClass { 
    @Autowired 
    private SomeInterface variable; 

    public void init(ServletContext servletContext) { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 
} 

Nicht über @Configurable und <context:spring-configured/> vergessen. Vollständiges Beispiel ist here

+0

Sie sollten das '@ Configurable' nicht benötigen. –

+0

Warum sollte nicht? – Cherry

+0

Es ist nicht notwendig, dass 'processInjectionBasedOnCurrentContext' funktioniert. Es sei denn, du brauchst es für etwas anderes ... –