【发布时间】:2015-12-15 23:58:42
【问题描述】:
我是 Spring 新手,但我无法弄清楚这一点。
当我两次或多次调用myMethod 时,myManager 中的propA 会被覆盖,并且每次都为相同的propA 值(最后设置)调用“doSomething”。
Spring注入是如何工作的?每次调用myMethod() 时,我都想要一个新的MyManager 实例。我的方法错了吗?
这是我的简化(错误)代码:
public class myClass {
private MyManager manager;
//..setter and getter
public String myMethod() {
//somelogic
manager.setPropA("a");
Thread tt = new Thread(manager);
try {
tt.start();
} catch (IllegalThreadStateException e) {
log.error("Errore", e);
}
}
}
public class MyManager implements Runnable {
private MyService service;
private String propA;
//Setters and getters
@Override
public void run() {
try {
// sleep(30000);
service.doSomething(propA);
} catch (Exception ex) {
//ERROR
}
}
}
弹簧配置:
<bean id="myClass" class="..." scope="prototype" >
<property name="manager" ref="MyManager"/>
</bean>
<bean id="MyManager" class="" scope="prototype">
<property name="service" ref="MyService"/>
</bean>
<bean id="MyService" class="...">
<property name="myDao" ref="MyDao" />
</bean>
是的,我有 @reos 。
我最终得到了这个解决方案,但我不太高兴并更改了我的代码。
如果有人感兴趣,这是我不满意的解决方案:
public class MyManager implements ApplicationContextAware, Runnable {
private MyService service;
private String propA;
private static ApplicationContext applicationContext;
public MyManager() {
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
//Others getters and setters
@Override
public void run() {
try {
// sleep(30000);
service= (MyService)this.applicationContext.getBean("MyService");
service.doSomething(propA);
} catch (Exception ex) {
//ERROR
}
}
}
public class myClass {
private MyManager manager;
//..setter and getter
public String myMethod() {
//somelogic
MyManager manager = new MyManager();
manager.setPropA("propA");
manager.setPropA("a");
Thread tt = new Thread(manager);
try {
tt.start();
} catch (IllegalThreadStateException e) {
log.error("Errore", e);
}
}
}
【问题讨论】:
-
你可以使用注解吗?
-
你如何获得“myClass”bean?通过 applicationcontext.getbean ?你可以访问应用程序上下文吗?
标签: java spring spring-mvc code-injection