java - Spring bean配置使用单例还是原型(prototype)?

标签 java spring spring-mvc spring-3

我正在使用Java7和Spring3。我有以下类(class)。

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 范围声明为原型(prototype)还是单例?

谢谢!

最佳答案

恕我直言,您工作得不好:进程和要处理的数据应该分开( 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

关于java - Spring bean配置使用单例还是原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21845969/

相关文章:

java - 单个 XSLT 文件能解决这个问题……还是……?

java - 使用私有(private)变量覆盖类中的方法

java - 从 TreeMap 克隆对象中删除元素不会从 java 中的主树形图对象中删除

java - 2 种方式的 SSL 身份验证无法使用 Apache httpclient : JAVA

java - 没有 XML 的 Spring + Hibernate。错误 : NoSuchBeanDefinitionException

java - 无法将 Spring LDAP 与 Spring Security 一起使用

performance - 使用带有 Hibernate 的 Spring Transactions,如何在同一事务中获得 2000 多个插入而不减慢速度?

java - 关于 spring mvc 表单处理表单和验证的问题

java - Spring MVC JSON序列化@JsonSerialize被忽略

java - Spring 5 + hibernate 5 : How SessionFactory is getting Autowired with LocalSessionFactoryBean