2014-09-10 15 views
13
@Configuration 
public class MyConfig { 
    @Bean(name = "myObj") 
    public MyObj getMyObj() { 
     return new MyObj(); 
    } 
} 

Ich habe dieses MyConfig-Objekt mit @Configuration Spring Annotation. Meine Frage ist, wie kann ich die Bean programmgesteuert (in einer regulären Klasse) abrufen?Bean programmgesteuert abrufen

zum Beispiel sieht das Code-Snippet so aus. Vielen Dank im Voraus.

public class Foo { 
    public Foo(){ 
    // get MyObj bean here 
    } 
} 

public class Var { 
    public void varMethod(){ 
      Foo foo = new Foo(); 
    } 
} 
+0

Versuchen Sie '@ Autowire' ... oder genauer' @Qualifier ("myObj") '. –

+0

Ich kann @Autowire nicht ausführen, weil ich Foo-Objekt erstellen muss, das neue in Laufzeit – user800799

+0

verwendet Überprüfen Sie die [Qualifier-Annotation] (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference /html/beans.html#beans-autowired-annotation-qualifiers). –

Antwort

6

Hier ein Beispiel

public class MyFancyBean implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    void setApplicationContext(ApplicationContext applicationContext) { 
    this.applicationContext = applicationContext; 
    } 

    public void businessMethod() { 
    //use applicationContext somehow 
    } 

} 

jedoch Sie selten direkt Application zugreifen müssen. In der Regel starten Sie es einmal und lassen Sie Bohnen sich automatisch auffüllen.

Hier gehen Sie:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 

Beachten Sie, dass Sie müssen enthalten keine Dateien eigentlich schon erwähnt, in applicationContext.xml. Jetzt können Sie einfach eine Bohne nach Name oder Typ holen:

ctx.getBean("someName") 

Beachten Sie, dass es Tonnen von Möglichkeiten, um Frühling zu beginnen - mit Context, @Configuration Klasse usw.

2

Die einfachste (wenn auch nicht die sauberste) Ansatz, wenn Sie wirklich Bohnen brauchen holen aus den ApplicationContext Ihre Klasse den ApplicationContextAware Schnittstelle implementieren haben und bietet die setApplicationContext() Methode.

Sobald Sie einen Verweis auf die ApplicationContext haben, haben Sie Zugriff auf viele Methoden, die Bean-Instanzen an Sie zurückgeben.

Der Nachteil ist, dass dies Ihre Klasse auf den Spring-Kontext aufmerksam macht, den Sie vermeiden sollten, wenn es nicht notwendig ist.

5

starten:

public class Foo { 
    public Foo(ApplicationContext context){ 
     context.getBean("myObj") 
    } 
} 

public class Var { 
    @Autowired 
    ApplicationContext context; 
    public void varMethod(){ 
      Foo foo = new Foo(context); 
    } 
} 
+1

@Xstian Ich gehe auch über 'ApplicationContext'. ; D –

+0

Sie haben Recht, sind ähnliche Lösungen: D – Xstian

Verwandte Themen