Spring bean配置使用单例还是原型?

时间:2014-02-18 06:31:18

标签: java spring spring-mvc spring-3

我正在使用Java7和Spring3。我有以下课程。

Request.java

public interface Request {
  public void doProcess();

}

RequestImpl.java

    @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

      }
}

SpringConfig.xml

<bean id="request" class="pkg.RequestImpl.java" />

现在客户端将使用RequestImpl,如下所示。

RequestImplreq = (RequestImpl)applicationContext.getBean("request");
req.setName("someName");
req.setAge("20");
req.doProcess();

现在我的问题是我需要在RequestImpl.java范围上声明原型还是单例?

谢谢!

3 个答案:

答案 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

相关问题