我正在使用Java7和Spring3。我有以下课程。
public interface Request {
public void doProcess();
}
@Transactional
public class RequestImpl implements Request{
private String name;
private String age;
//setters and getters
public void doProcess(){
//use name and age and call third party class which will save data into database
}
}
<bean id="request" class="pkg.RequestImpl.java" />
现在客户端将使用RequestImpl,如下所示。
RequestImplreq = (RequestImpl)applicationContext.getBean("request");
req.setName("someName");
req.setAge("20");
req.doProcess();
现在我的问题是我需要在RequestImpl.java范围上声明原型还是单例?
谢谢!
答案 0 :(得分:0)
@ user3269829:默认情况下,范围是singleton
现在它完全取决于您的要求,如果您想为每个请求提供一个bean对象,那么您可以选择“prototype
”并且如果您想要在多个请求中共享单个bean对象,那么你可以去“singleton
”
答案 1 :(得分:0)
这取决于您的第三方课程的实施方式。如果要确保类的单个实例,可以使用spring bean的工厂方法并确保单个实例。
检查 &#34; 3.3.2.2使用静态工厂方法实例化&#34; Spring Documentation 的一部分
在bean定义中应该如下所示:
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
和单身创作者:
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
private DefaultServiceLocator() {}
public ClientService createClientServiceInstance() {
return clientService;
}
}
答案 2 :(得分:0)
恕我直言,你工作不正常:要处理的流程和数据应该分开(Can DTOs be spring managed beans?),因此doProcess()
应该被定义为doProcess(name,age)
,或者在工厂或类似的东西后面加上阴影。<登记/>
可能最好的选择是定义
public interface Request {
public void doProcess(String name,String age);
}
@Transactional
public class RequestImpl implements Request{
public void doProcess(String name,String age){
// do what you want
}
}
你的SpringConfig.xml保持不变,调用代码将变为:
Request req= applicationContext.getBean(Request.class);
req.doProcess("someName", "20");
除此之外,执行ApplicationContext.getBean()
并将结果转换为实现(通常)是不好的实践,因为Spring可以代理返回的对象并且强制转换为实现将失败并显示ClassCastException