@Configuration
public class MyConfig {
@Bean(name = "myObj")
public MyObj getMyObj() {
return new MyObj();
}
}
J'ai cet objet MyConfig avec l'annotation @Configuration Spring. Ma question est la suivante: comment puis-je récupérer le bean par programme (dans une classe régulière)?
par exemple, l'extrait de code ressemble à ceci. Merci d'avance.
public class Foo {
public Foo(){
// get MyObj bean here
}
}
public class Var {
public void varMethod(){
Foo foo = new Foo();
}
}
Voici un exemple
public class MyFancyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void businessMethod() {
//use applicationContext somehow
}
}
Cependant, vous avez rarement besoin d'accéder directement à ApplicationContext. En règle générale, vous le démarrez une fois et laissez les beans se remplir automatiquement.
Voici:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Notez que vous n'avez pas à mentionner les fichiers déjà inclus dans applicationContext.xml. Maintenant, vous pouvez simplement récupérer un bean par nom ou type:
ctx.getBean("someName")
Notez qu'il existe de nombreuses façons de démarrer Spring - en utilisant ContextLoaderListener, la classe @Configuration, etc.
Essaye ça:
public class Foo {
public Foo(ApplicationContext context){
context.getBean("myObj")
}
}
public class Var {
@Autowired
ApplicationContext context;
public void varMethod(){
Foo foo = new Foo(context);
}
}
L'approche la plus simple (mais pas la plus propre) si vous avez vraiment besoin de récupérer des beans à partir de ApplicationContext
est que votre classe implémente l'interface ApplicationContextAware
et fournisse la méthode setApplicationContext()
.
Une fois que vous avez une référence à ApplicationContext
, vous avez accès à de nombreuses méthodes qui vous renverront des instances de bean.
L'inconvénient est que cela rend votre classe consciente du contexte de Spring, que l'on devrait éviter à moins que cela ne soit nécessaire.