Как заставить класс использовать фасоли applicationContext? - PullRequest
2 голосов
/ 05 июня 2009

Я работаю над своим первым веб-приложением java struts2 и хочу иметь возможность вставлять параметры bean-компонента в любой произвольно вызываемый класс. Но я нахожу, что я могу сделать это только с помощью классов действий Struts ...

Допустим, у меня есть этот bean-компонент в моем файле applicationContext.xml:

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

Если у меня есть настройка класса действий Struts, называемая BeanTest (например), и я добавляю установщик (public void setTest ()), тогда будет задан тестовый параметр, и я смогу получить к нему доступ.

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;
    }
}

Если я создаю экземпляр BeanTest2 в BeanTest и вызываю getTest, он всегда возвращает ноль.

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";
    }
}

Я хочу настроить bean-компонент в applicationContext, чтобы я мог указать ему произвольный класс, и этот класс всегда будет получать любые параметры бина, которые я установил (при условии, что я создал для них установщики). К сожалению, происходит то, что только классы действий Struts могут получить эти свойства компонента. Все не устанавливается.

Этот вопрос понятен? Я чувствую, что упускаю что-то очевидное из того, как работают бобы.

1 Ответ

2 голосов
/ 05 июня 2009

Я думаю, что 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.

...