Spring管理非静态工厂创建的bean

时间:2013-01-02 10:36:37

标签: xml spring factory

我有一些Spring托管类(通过xml配置),其中一个是SessionFactory,它被注入到另一个Spring托管类中。每当这个类需要一个新的Session时,它就会在SessionFactory上调用createSession。

然而,除非我错了,否则这意味着Sessions本身不是Spring管理的,这是有问题的,因为它们有一些@Transactional方法,需要bean由Spring管理。

我一直在阅读FactoryBeans,但我不确定最好的方法是这样做,特别是当我的createSession方法接受一个参数时,而FactoryBean.getObject()却没有。

我可以使用getObject然后手动将参数设置得更高,但如果可能的话我想在工厂强制设置。

有人可以帮忙吗?提前致谢。下面是一个简化的例子。

public class SessionFactory {

    public final Session createSession(String username){
        Session session = new SessionImpl(username);
        return session;
    }

}


public class SessionImpl implements Session{

    private String username;

    @Override
    @Transactional
    public void doSomething(){
        // Does something
    }

    public void setUsername(String username){
        this.username = username;
    }

    public String getUsername(){
        return username;
    }

}


public class Service {

    private SessionFactory sessionFactory; // Set by Spring through xml config

    public void doSomethingServicy(){

    }

    public void setSessionFactory(SessionFactory sessionFactory){
        this.sessionFactory = sessionFactory;
    }


}

2 个答案:

答案 0 :(得分:1)

我会说你在错误的地方得到了@Transactional注释。

这不应该是会话的会话;它应该应用于满足您的用例的基于接口的服务方法。这是典型的春天成语。我建议关注它。

答案 1 :(得分:1)

我通过在Spring中创建工厂bean来解决它,并使用工厂bean和工厂方法声明一个原型范围的Session对象,如下所示:

<bean id="sessionFactory" class="com.SessionFactory" >
        <property name="dependencyA" ref="dependencyA" />
        <property name="dependencyB" ref="dependencyB" />
</bean>

<bean id=session" class="com.SessionImpl" factory-bean="sessionFactory" factory-method="createSession" scope="prototype" />

然后在需要时在代码中检索新实例:

Session session = (Session) applicationContext.getBean(SpringConstants.SESSION_BEAN_NAME, username);

这里的用户名是Object...方法参数的一部分,它构成了传递给工厂的参数createSession方法

我很欣赏程序的结构可能会更好,但考虑到对代码的限制,它可以很好地解决问题。