web-dev-qa-db-fra.com

récupérer Bean par programme

@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();
    }
}
15
user800799

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.

8
Xstian

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);
    }
}
7
Peter Rader

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.

4
Jim Garrison