如何让一个类使用applicationContext bean?

时间:2009-06-04 20:21:49

标签: java spring struts javabeans

我正在研究我的第一个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属性。一切都没有定。

这个问题清楚了吗?我觉得我错过了关于豆子工作方式的一些明显的东西。

1 个答案:

答案 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实例。