Java 支持非spring实例化的类中的自动连接(3)
我意识到这应该是非常基本的,但我还没有找到继Helloworld之后的第二步示例 因此,我得到的是: 名为spring-beans.xml的spring配置xml:Java 支持非spring实例化的类中的自动连接(3),java,spring,autowired,Java,Spring,Autowired,我意识到这应该是非常基本的,但我还没有找到继Helloworld之后的第二步示例 因此,我得到的是: 名为spring-beans.xml的spring配置xml: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="org" />
</beans>
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<Obj1> runJobs(final List<Obj1> obj1s) {
List<Obj1> jobsGoneBad = new ArrayList<Obj1>();
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;
}
}
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调用初始化应用程序,然后通过使用@Autowired成功实例化DAO1实例
然后,我创建了一个非托管的Job实例,并希望通过使用@Autowired在该类中注入“singletonish”依赖项
两个Dao类都是spring原型,scanner发现它们很好
所以我的问题基本上是,我应该如何实例化作业实例,以便在其中使用@Autowired概念
如果我需要一个全局可访问的应用程序上下文,如何最好地介绍它?将
@Component
注释添加到您的JobImpl
类中。在xml中为此类添加组件扫描,您的自动连接将适用于dao2
(提供getter setter方法)。默认情况下,SpringBean是单例的。然而,您需要的是多个实例,并且在运行时创建了多个实例
一种可能性是使用它。您将创建一个容器感知作业工厂,该工厂将从容器请求新实例
(我认为需要在这些运行时实例中注入DAO引用有点可疑……我可能会尝试重新思考逻辑。例如,为什么不能在构造函数参数中提供DAO引用,或者从其他地方使用它。在DAO中可以有一个接受作业实例或runWit的方法。)JobImpl中的h(DAO2 dao)内容,该内容将满足于在其他地方注入的类,或者JobProcessor服务,该服务将注入dao并从Jobs实例中询问相关信息……)@Autowired无法工作,因为您的JobImpl对象不是由spring管理的,因此它从来没有机会注入它。spring管理的bean是在组件扫描期间或XML定义中创建实例的bean。在您的例子中,JobImpl被实例化为普通Java对象 一种解决方案是在spring上下文中用手动查找代替自动布线
private DAO2 dao2 = SpringApplicationContext.getApplicationContext ().getBean (DAO2.class);
@Autowired在@AppImpl中工作,因为它被注释为@Component。这将在其类路径扫描期间为spring标记它,它将创建此类的实例并执行任何自动连接/注入。您只能在spring托管Bean中使用spring Bean功能,如注入 但是您可以使用
@可配置的注释,但这需要使用真正的AspectJ。
如果一个类由@可配置的(并且您使用AspectJ)注释,那么您可以使用Springs注入注释,即使这个类是由一个普通的新的创建的
@看
- 弹簧参考:
我不认为这是问题所在-问题在于他正在运行时手动创建JobImpl类,绕过spring容器。我明白了,但正如您可能已经注意到的,JobImpl接收到一个Obj1构造函数参数,并打算处理数千个参数,这使得使用@Component的选项无效,因为它不是对象与singelton behavior有关。谢谢你的礼貌。:)你介意详细阐述一下“其他地方”的想法吗。这些信息与解决当前设计的问题有关,但我认为,按照另一篇文章的建议,重新设计可以更好地解决问题。显然值得投一票!谢谢你的意见。我知道它为什么不起作用。我更多地是在寻找最佳替代实现的投入,以使其发挥作用。我不认为每次运行到应用程序上下文时,我都需要像重新设计另一个答案那样解决它
@Repository("DAO2") //Focus of question: DAO2 is a repository stereotype
public class DAO2 {
myfind() { ...}
}
private DAO2 dao2 = SpringApplicationContext.getApplicationContext ().getBean (DAO2.class);