我正在研究我的第一个java struts2 webapp,并希望能够将bean参数注入任何被调用的任意类中。但是我发现我只能用struts动作类做到这一点......
假设我在applicationContext.xml文件中有这个bean:
<bean id="BeanTest" class="BeanTest">
<property name="test" value="someval" />
</bean>
如果我有一个名为BeanTest的struts动作类设置(如此),并且我添加了一个setter(public void setTest()),那么将设置test参数并且我可以访问它。
import com.opensymphony.xwork2.ActionSupport;
public class BeanTest extends ActionSupport{
private String test;
public String execute(){
String str = getTest(); // returns "someval"
return "success";
}
public void setTest(String test){
this.test = test;
}
public String getTest(){
return test;
}
}
但是,假设我将bean更改为BeanTest2,如下所示:
<bean id="BeanTest2" class="BeanTest2">
<property name="test" value="someval" />
</bean>
我有一个像这样的独立课程:
public class BeanTest2{
private test;
public void setTest(String test){
this.test = test;
}
public String getTest(){
return test;
}
}
如果我在BeanTest中创建BeanTest2的实例,并调用getTest,它总是返回null。
import com.opensymphony.xwork2.ActionSupport;
public class BeanTest extends ActionSupport{
public String execute(){
BeanTest2 bt = new BeanTest2();
String str = bt.getTest(); //returns null, but I want "someval"
return "success";
}
}
我想要做的是在applicationContext中设置一个bean,这样我就可以将它指向一个任意的类,并且该类将始终获取我设置的任何bean参数(假设我为它们创建了setter)。不幸的是,只有struts动作类才能获得这些bean属性。一切都没有定。
这个问题清楚了吗?我觉得我错过了关于豆子工作方式的一些明显的东西。
答案 0 :(得分:2)
我认为Spring通常只对那些由Spring创建的类进行依赖注入,而不是那些用new运算符自己创建的类。
BeanTest是由Spring创建的,因此它会注入其依赖项,但Bean不是由Spring创建的,因此Spring对BeanTest2实例一无所知。
您可以将BeanTest2添加为BeanTest中的字段
public class BeanTest {
private BeanTest2 beanTest2;
public void setBeanTest2(BeanTest2 b) { this.beanTest2 = b; }
public BeanTest2 getBeanTest2() { return this.beanTest2; };
}
然后你可以将beanTest2注入beanTest实例。
<bean id="beanTest2" class="BeanTest2">
<property name="test" value="someval" />
</bean>
<bean id="beanTest" class="BeanTest">
<property name="beanTest2" ref="beanTest2" />
</bean>
这样beanTest2应该注入BeanTest实例。