我正在开发我的第一个java struts2 webapp,希望能够将Bean参数注入到所调用的任意类中。但是我发现我只能使用struts动作类来做到这一点...

假设我的applicationContext.xml文件中有这个bean:

<bean id="BeanTest" class="BeanTest">
    <property name="test" value="someval" />
</bean>


如果我有一个名为BeanTest的struts动作类设置(像这样),并且添加了一个setter(公共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属性。一切都没有定下来。

这个问题清楚吗?我觉得我似乎缺少关于豆类工作方式的明显认识。

最佳答案

我认为Spring通常只对Spring创建的类进行依赖注入,而不是对使用new运算符创建的类进行依赖注入。

BeanTest是由Spring创建的,因此它将注入其依赖项,但是BeanTest2不是由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实例中。

10-08 15:26