在没有弹簧实例化的类中支持自动assembly(3)

我意识到这应该是非常基本的,但我还没有在Helloworld之后找到第二步

所以我拥有的是:

spring config xml名为spring-beans.xml:

    

弹簧上下文初始化类:

 public static void main(String[] args) { // initialize Spring ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring-beans.xml"); App app = (App) context.getBean("app"); app.run(); } 

AppImpl类的相关细节:

 @Component("app") public final class AppImpl implements App{ // focus of question: This autowiring works @Autowired private DAO1 dao1; public void run() { //focus of question: This works as daoclass is instantiated properly obj1s = dao1.myFind(); badJobs = runJobs(obj1s); } private List runJobs(final List obj1s) { List jobsGoneBad = new ArrayList(); for (Obj1 next : obj1s) { // focus of question: usage of new keyword, thus not spring container managed? Job job = new JobImpl(next); job.run(); } return jobsGoneBad; } } 

JobImpl的相关细节:

 public class JobImpl implements Job { private Obj1 obj1; // focus of question: can't autowire @Autowired private DAO2 dao2; @Override public void run() { //focus of question: opDAO == null - not initialized by @Autowired Obj2 obj2 = dao2.myFind(); } } 

DAO1的相关细节:

 @Repository("DAO1") //Focus of question: DAO1 is a repository stereotype public class DAO1 { myfind() { ...} } 

DAO2的相关细节:

 @Repository("DAO2") //Focus of question: DAO2 is a repository stereotype public class DAO2 { myfind() { ...} } 

是的,所以我通过springcontext调用初始化App,然后通过使用@Autowired成功实例化DAO1实例。

然后我创建一个非托管的Job实例,并希望通过使用@Autowired在该类中注入“singeltonish”依赖项

两个Dao类都是spring的刻板印象,扫描仪发现它们很好。

所以我的问题基本上是,如何实例化作业实例以便我可以在其中使用@Autowired概念?

如果我需要一个全局可访问的applicationcontext,我该如何最好地介绍它?

Spring bean默认是单例。 但是,您需要的是多个实例,最重要的是,多个实例创建了运行时。

一种可能性是使用方法注入 。 您将创建一个容器感知作业工厂,它将从容器中请求新实例。

(我认为你需要在那些运行时实例中注入DAO引用有点可疑……我可能会尝试重新思考逻辑。为什么你不能在构造函数参数中提供DAO引用,例如,或者完全从其他地方使用它。你可以在dao中有一个接受Job实例的方法,或者在JobImpl中运行runWith(DAO2 dao)的东西,这些东西会被其他地方注入的类所满足,或者是一个JobProcessor服务。注入daos并询问Jobs实例中的相关信息…)

您可以在Spring托管bean中使用Spring Beanfunction,例如注入!

但是您可以使用@Configurable Annotation,但这需要您使用REAL AspectJ。 如果一个类由@Configurable注释(并且您使用AspectJ),那么即使此类是由普通的new创建的,也可以使用Springs Injection Annotations。

@看到

  • Spring参考: 第8.8.1章使用AspectJ依赖Spring注入域对象
  • 使用@Configurable进行Spring自动assembly

@Autowired无法正常工作,因为您的JobImpl对象不是由spring管理的,所以它永远不会有机会注入它。 Spring托管bean是在组件扫描期间或XML定义中创建实例的bean。 在您的情况下,JobImpl被实例化为普通的Java对象。

一种解决方案是在弹簧环境中使用手动查找替换自动布线。

 private DAO2 dao2 = SpringApplicationContext.getApplicationContext ().getBean (DAO2.class); 

@Autowired正在@AppImpl中工作,因为它注释为@Component。 这会在类路径扫描期间将其标记为spring,它将创建此类的实例并执行任何自动assembly/注入。

@Component注释添加到JobImpl类。 在xml中为此类添加组件扫描,您的自动assembly将适用于dao2 (提供getter-setter方法)。