Правильный способ получения бобов из applicationContext Spring - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть фабрика, которая создает экземпляры:

public class myFactory {
    public static getInstace() {
        switch(someInt) {
            case 1:
                return new MySpringBean();
            case 2:
                return new MyOtherSpringBean();
        }
    }
}

Мне нужно вернуть новый экземпляр bean-компонентов, которые «управляются» Spring, поскольку у них есть методы транзакционной бизнес-логики.Я читал во многих постах здесь, что я не должен использовать метод getBean для получения синглтона или нового экземпляра из applicationContext.Но я не могу найти правильный способ сделать это для моего случая.Я использовал @Resource, и он, кажется, работает, но он не поддерживает статические поля.Спасибо

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Весной есть много способов сделать это, наиболее очевидный способ, учитывая, что у вас есть фабричный класс, это использовать JavaConfig .Если вы использовали аннотации JavaConfig с поддержкой Spring, вы можете сделать следующее для построения ваших bean-компонентов и добавления их в контекст приложения:

@Configuration
public class myFactory {
    @Bean
    public static getInstance() {
        switch(someInt) {
            case 1:
                return new MySpringBean();
            case 2:
                return new MyOtherSpringBean();
        }
    }
}
0 голосов
/ 30 сентября 2011

Вы реализуете интерфейс org.springframework.beans.factory.FactoryBean для объектов, которые сами являются фабриками .

Интерфейс FactoryBean - это точка подключения к логике создания контейнера Spring IoC.Если у вас есть сложный код инициализации, который лучше выражен в Java, в отличие от (возможно) многословного объема XML, вы можете создать свой собственный FactoryBean, записать сложную инициализацию внутри этого класса, а затем вставить свой собственный FactoryBean в контейнер.

Интерфейс FactoryBean предоставляет три метода:

  • Object getObject(): возвращает экземпляр объекта, который создает эта фабрика.Экземпляр может использоваться совместно, в зависимости от того, возвращает ли эта фабрика синглтоны или прототипы.

  • boolean isSingleton(): возвращает true, если этот FactoryBean возвращает синглтоны, в противном случае - false.

  • Class getObjectType(): возвращает тип объекта, возвращаемый методом getObject (), или значение NULL, если тип заранее не известен

Взгляните на Весенние документы

0 голосов
/ 29 сентября 2011

Один из способов - создать фабричный класс и сохранить экземпляры bean-компонентов (каждый из которых реализует общий интерфейс MyBean) в виде значений под некоторым ключом на карте (beans):

public class MyBeanFactory {

    private Map<Integer, MyBean> beans;

    public MyBean create(Integer which) {
        if (which != null)
            return beans.get(which);
        else
            throw new IllegalArgumentException("Unknown bean");
    }

    public void setBeans(Map<Integer, MyBean> beans) {
        this.beans = beans;
    }
}

В вашей Spring applicationContext.xml теперь создайте bean-компонент фабрики и установите bean-компоненты:

<beans...>
    <bean id="myBeanFactory" class="foo.bar.MyBeanFactory">
        <property name="beans">
            <map>
                <entry key="1">
                    <bean class="foo.bar.MyBeanA" />
                </entry>
                <entry key="2">
                    <bean class="foo.bar.MyBeanB" />
                </entry>
            </map>
        </property>
    </bean>
</beans>

Наконец, вы можете ввести фабрику bean-компонентов как обычно и получать экземпляры, например, вот так:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" })
public class MyBeanFactoryTest {

    @Autowired
    private MyBeanFactory myBeanFactory;

    @Test
    public void test() {
        Assert.assertTrue(myBeanFactory.create(1) instanceof MyBeanA);
        Assert.assertTrue(myBeanFactory.create(2) instanceof MyBeanB);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...