在没有弹簧实例化的类中支持自动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方法)。
- Java Config @Bean未在其他@Configuration类中自动assembly
- @Autowired HttpServletResponse
- 将请求范围的bean注入另一个bean
- 无法自动assembly字段:private org.springframework.security.core.userdetails.UserDetailsService
- Spring:获取某些接口和类型的所有Bean
- 自动assembly:预计至少有一个bean可以作为此依赖关系的autowire候选者
- 如何在Spring中更新@Autowired String bean的值?
- 如何使用Spring手动自动assemblybean?
- 更清洁的方式来获得原型的自动assembly字段的新实例