我有一些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;
}
}
答案 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
方法
我很欣赏程序的结构可能会更好,但考虑到对代码的限制,它可以很好地解决问题。