Au Printemps javaconfig, comment initialiser un @Bean qui dépend d'un @Service
J'ai converti un Printemps 4.0 projet de xml javaconfig.
Lors de l'initialisation, l'un de mes haricots besoin d'accéder à Hibernate pour chercher un peu de config-les données de la DB, par l'intermédiaire d'un Ressort @Service (buildingService
). Le haricot d'initialisation ressemble à ceci:
@Bean
@DependsOn({ "transactionManager", "webSocketHandler", "buildingService" })
Smarty smarty() {
Smarty bean = new Smarty();
bean.init(); //I also tried @Bean(initMethod = "init") with no difference
return bean;
}
Le problème est que dans bean.init()
, le service est accessible, qui échoue avec un NullPointerException
.
J'ai ajouté buildingService
à @DependsOn
mais il n'a pas aidé.
Probablement le @Service
annotée classes sont traitées après la @Bean
!?
Puis-je initialiser le @Service
annotées à la classe moi d'avance?
Edit 1
Merci beaucoup pour tous les commentaires !
J'ai besoin d'ajouter quelques détails:
buildingService n'est pas un @Bean
, c'est, ainsi, un @Service
et ressemble à ceci:
@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 est un moteur de Printemps managed Bean, et initialisé dans un @Configuration
annotées à la classe qui est en train de faire l'initialisation de la racine de contexte.
Smarty a une dépendance directe sur buildingService, comme suit:
@Resource(name = "buildingService")
private BuildingService buildingService;
J'ai essayé l'annotation Smarty.init()
avec @PostConstruct
mais cela n'a pas changer quoi que ce soit.
Noter que la première chose Smarty.init()
n'appelle buildingService.getAll();
OriginalL'auteur yglodt | 2014-01-26
Vous devez vous connecter pour publier un commentaire.
Vous êtes confus au sujet de la durée de vie d'un bean. Le printemps est de créer d'abord les haricots avant de pouvoir injecter quoi que ce soit. Dans votre
@Bean
méthode, vous avez créé votre beanalors immédiatement appelé une de ses méthodes
qui semble dépendre de l'un champ injecté.
Il n'y a rien entre les deux appels. Comment voulez-vous que le Printemps à ne rien faire?
Au lieu de cela, vous pouvez annoter vos
init()
méthode avec@PostConstruct
. Une fois que le Printemps se fait initialisation de votre bean, c'est à dire. lorsque votre@Bean
méthode retourne et le Printemps injecte tout l'objet de l'injection des cibles, il va appeler la méthode automatiquement.@DependsOn
n'est pas nécessaire ici.OriginalL'auteur Sotirios Delimanolis
@Sevice
annoté haricots sont autodiscovered et initialisé composant via la numérisation, afin de permettre cette utilisation@ComponentScan
sur la Configuration Spring.@Bean
sont utilisés pour le manuel de la création de haricots, sans l'aide de l'annotation comme@Service
ou d'un composant de balayage.Contexte de configuration
Et votre
Smarty
beanOriginalL'auteur MariuszS
Vous n'avez pas besoin de la
@DependsOn
annotation que vous Smarty bean a (ou devrait avoir) une dépendance directe sur BuildingService. Voir la@DependsOn
javadoc pour plus d'informations sur le moment de l'utiliser.L'exemple suivant montre comment vous pouvez résoudre votre problème:
OriginalL'auteur Pieter