2012-04-13 18 views
2

injizieren Ich habe eine laufende Spring 3 Web-Anwendung. Alle Beans sind korrekt eingefügt und alles funktioniert so wie es sollte (alle Web-Service-Aufrufe funktionieren ordnungsgemäß).Wie Spring Bean in Thread

Beim Erweitern der Anwendung musste ich Threads hinzufügen, die gestartet werden können & gestoppt über einen Webdienst.

In den Thread muss ich einige Frühlingsbohnen injizieren. Dies sind Dienste (kommentiert mit @Service). In meinem application werden die Bohnen über eine Komponente Scan erkannt:

<context:component-scan base-package="<package>"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan> 

Aber wenn ich versuche, die Bohnen (mit @Resource) im Thread sind sie immer ‚Null‘ (Frühling nicht injiziert sie) zu injizieren. Der Thread wird gestartet, schlägt aber während der Initialisierung fehl.

Ich habe auch versuchte sie die Injektion von der application in Code geladen: (Anwendungskontext wird in ‚src/main/resources‘ befindet)

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:*applicationContext.xml"); 

if(applicationContext.containsBean("BeanName")) { 

     beanObject = (BeanClass) applicationContext.getBean("BeanName"); 

} else { 

    //Exception 
} 

Hat keine Ahnung, jemand, wie die Bohnen in dem Thread zu injizieren ? Oder ist es nicht möglich, Bohnen in einen Thread zu injizieren?

Vielen Dank im Voraus!

+0

[Mögliches Duplikat] (http://stackoverflow.com/a/1377740/248082). Basierend auf dieser Antwort erweitert Ihre benutzerdefinierte Klasse 'Thread'. – nobeh

Antwort

1

Es wäre besser, die Geschäftslogik (den Code, der von Ihren Diensten abhängt) vom Infrastrukturcode zu trennen, der Threads verwaltet.

Zum Beispiel können Sie eine Bean deklarieren, die Runnable für Ihre Geschäftslogik implementiert und dann verwenden, wenn Sie eine Thread starten müssen.

Allerdings ist das manuelle Starten von Thread auch keine gute Übung. Es wäre besser, stattdessen Thread-Pools zu verwenden. Tatsächlich bietet Spring einige integrierte Unterstützung für Thread-Pools und asynchrone Ausführung, so dass Sie es nutzen können, siehe 25. Task Execution and Scheduling.