In Spring javaconfig, wie zum initialisieren einer @Bean, die abhängig von einem @ - Service
Habe ich Umgerechnet eine Feder 4.0-basierten Projekt von xml zu javaconfig.
Zur Initialisierung, einer meiner Bohnen benötigt Zugriff auf Hibernate zu Holen, config-Daten aus der DB, durch eine Feder @Service (buildingService
). Die bean-Initialisierung sieht wie folgt aus:
@Bean
@DependsOn({ "transactionManager", "webSocketHandler", "buildingService" })
Smarty smarty() {
Smarty bean = new Smarty();
bean.init(); //I also tried @Bean(initMethod = "init") with no difference
return bean;
}
Das problem ist, dass in bean.init()
den service zugegriffen wird, was nicht mit einem NullPointerException
.
Fügte ich buildingService
zu @DependsOn
aber es hat nicht geholfen.
Wahrscheinlich die @Service
-annotierten Klassen werden verarbeitet, nachdem die @Bean
!?
Kann ich initialisieren die @Service
-annotierten Klasse mich im Voraus?
Bearbeiten 1
Danke soweit für das feedback !
Muss ich hinzufügen, einige details:
buildingService ist nicht ein @Bean
ist es gut, eine @Service
und sieht wie folgt aus:
@Service("buildingService")
@Transactional
public class BuildingService {
...
public List<Building> getAll() {
final Session session = sessionFactory.getCurrentSession();
final Query query = session.createQuery("from Building order by name");
return query.list();
}
...
}
Smarty ist ein Spring managed Bean und initialisiert in einem @Configuration
-annotierten Klasse, die das tun der Initialisierung des root-Kontext.
Smarty hat eine direkte Abhängigkeit von buildingService, etwa so:
@Resource(name = "buildingService")
private BuildingService buildingService;
Habe ich versucht Anmerkungen Smarty.init()
mit @PostConstruct
aber das änderte nichts.
Beachten Sie, dass das erste, was Smarty.init()
tut, ist die Berufung buildingService.getAll();
InformationsquelleAutor der Frage yglodt | 2014-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist verwirrt über den Lebenszyklus einer bean. Frühling hat zuerst die Bohnen, bevor Sie es zu injizieren etwas. In Ihrem
@Bean
Methode, die Sie erstellt haben und Ihre beandann rief sofort eine seiner Methoden
dass scheint zu hängen auf einem Feld injiziert werden.
Es gibt nichts zwischen diesen beiden anrufen. Wie kann Sie erwarten, dass der Frühling zu tun?
Stattdessen können Sie kommentieren Ihre
init()
Methode mit@PostConstruct
. Sobald Frühling ist getan Initialisierung von bean, dh. wenn Ihr@Bean
Methode gibt und die Feder spritzt alle Objekt-Einspritzung Ziele, es ruft die Methode automatisch auf.@DependsOn
ist hier nicht notwendig.InformationsquelleAutor der Antwort Sotirios Delimanolis
@Sevice
kommentierte Bohnen sind autodiscovered und initialisiert über die Komponenten-scan, um dies zu ermöglichen verwenden@ComponentScan
an der Spring-Konfiguration.@Bean
verwendet werden, für die manuelle Erstellung von Bohnen, ohne Verwendung von speziellen Annotationen wie@Service
- oder component-scan.Kontext-Konfiguration
Und Ihre
Smarty
beanInformationsquelleAutor der Antwort MariuszS
Brauchen Sie nicht die
@DependsOn
annotation, wie Sie Smarty bean hat (oder sollte haben) eine direkte Abhängigkeit von BuildingService. Finden Sie die@DependsOn
javadoc für mehr info auf, wenn es zu benutzen.Im folgenden Beispiel wird veranschaulicht, wie Sie Ihr problem lösen:
InformationsquelleAutor der Antwort Pieter