2016-06-14 9 views
2

Ich habe solche Feder Boot-Test:Reihenfolge der Deklaration von Config-Klassen in SpringApplicationConfiguration. Frühlings-Boot-

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = { 
    PropertyConfig.class, 
    ServiceConfigA.class, 
    ServiceConfigB.class} 
) 
public class SpringTest { 

    @Test 
    public void test() { 
    ... 
    } 
} 

Wenn PropertyConfig Klasse deklariert erste in der Liste der Klassen I erhalten Kontext Initialisierung Fehler, da Bohnen innerhalb PropertyConfig ignoriert und Bohnen aus dem Dienst configs können einige Felder nicht autowire. Wenn ich nach einigen serivce-Konfigurationen PropertyConfig verschiebe, werden die Beans innerhalb PropertyConfig initialisiert.

Genauer gesagt enthält PropertyConfig zwei Bohnen: PropertiesFactoryBean und PropertySourcesPlaceholderConfigurer. Ursache von PropertySourcesPlaceholderConfigurer ist nicht vorhanden. Beans aus Dienstkonfigurationen konnten Felder mit @Value Annotation nicht automatisch verbinden (kann nicht automatisch von String in Integer konvertiert werden).

Meine Frage ist, warum Bohnen von PropertyConfig im ersten Fall nicht initialisiert werden? Gibt es einige Funktionen zum Laden von Konfigurationen in Spring Boot-Tests?

+0

Hat mein Tipp, Ihre 'PropertySourcesPlaceholderConfigurer' Beans' statische' Arbeit für Sie zu machen? –

Antwort

0

Spring scannt die im CI-Container registrierten Abhängigkeiten und ermittelt die Reihenfolge ihrer Initialisierung. Die Bestellung, auf die Sie sich beziehen, ist überhaupt nicht relevant.

Wenn es für Sie scheitert, muss es ein anderes Problem in Ihrer Verdrahtung geben. Aber Sie haben uns Ihren Code nicht gezeigt, so schwer, die Ursache zu ermitteln.

0

Consult die "BeanFactoryPostProcessor-Rückkehr @Bean Methoden" -Abschnitt der Javadoc für @Bean:

Besondere Beachtung muss für @Bean Methoden gezogen werden, dass Frühling BeanFactoryPostProcessor (BFpp) Typen zurück. Da BFPP-Objekte sehr früh im Container-Lebenszyklus instanziiert werden müssen, können sie die Verarbeitung von Anmerkungen wie @Autowired, @Value, und @PostConstruct innerhalb von @Configuration-Klassen beeinträchtigen. Um diese Lebenszyklusprobleme zu vermeiden, markieren Sie BFPP-zurückführende @Bean-Methoden als statisch. Für Beispiel:

@Bean 
public static PropertyPlaceholderConfigurer ppc() { 
    // instantiate, configure and return ppc ... 
} 

Durch diese Methode als statische Markierung kann, ohne dass die Instanziierung seiner erklären @Configuration Klasse aufgerufen werden, so dass die oben genannten Lifecycle-Konflikte zu vermeiden. Beachten Sie jedoch, dass statische @Bean-Methoden nicht für Scoping und AOP Semantik wie oben erwähnt erweitert werden. Dies funktioniert in BFPP-Fällen, da diese normalerweise nicht von anderen @Bean-Methoden referenziert werden. Zur Erinnerung, eine WARN-Level-Protokollnachricht wird für alle nicht statischen @Bean-Methoden mit einem Rückgabetyp, der BeanFactoryPostProcessor zugewiesen werden kann, ausgegeben.

Mit anderen Worten stellen Sie sicher, dass Ihre PropertiesFactoryBean und PropertySourcesPlaceholderConfigurer Bohnen als static deklariert werden, und es sollte funktionieren.

Verwandte Themen