【问题标题】:Stateless Service Layer in SpringSpring中的无状态服务层
【发布时间】:2018-05-04 22:19:15
【问题描述】:

这些天我在做一个 Web 项目,我只想澄清一些关于 Spring bean 范围和基于 Spring 的开发的最佳实践的事情。这里我使用的是一个使用示例代码的场景

我有一个如下的 Web 控制器

@Controller
Public class JobController{
   private JobService jobService;

   @Autowired
   public void setJobService(JobService jobService ) {
       this.jobService = jobService ;
    }

    public void run(){
         Job job = new Job();
         -- Setting the properties for the Object

        jobService.run(job);
    }

}

然后我有如下服务

@Service
Public class JobService {
     public void run(Job job){
         -- perform the business logic
    }
}

在这里,我想使 JobService 类无状态,因此我可以将 JobService 定义为单例,从而减少不必要的对象创建。根据我的理解,按顺序使类无状态,我们不想保留实例属性。在这种情况下,我将不同的 Job 对象传递给服务。这是否使这个 JobService 有状态,因为 JObservice 处理不同的不同作业对象?你能帮我理解吗

谢谢, 凯斯

【问题讨论】:

  • 默认情况下,在 Spring 中,所有 spring bean 都是单例的,除非另有说明。所以如果你在 JobService 上默认有 @Service 它是一个单例
  • @pvpkiran 感谢您的回复。是的,Spring bean 默认是单例的。但是我们是否需要将服务类内部的逻辑控制为单例。即使我们标记为单例,开发者有什么办法可以违反单例行为?

标签: spring spring-bean stateless service-layer


【解决方案1】:

传递不同的对象不会使您的服务有状态。

以这个为例。

@Service
Public class JobService {
  private Job currentJob;
  public void setJob(Job job) {
     currentJob = job;
  }
  public void run(){
      -- perform the business logic on currentJob
  }
}

这会使 bean 成为“有状态”并导致无法解释的行为。

多个控制器/线程在单例中执行方法不会发生冲突,可以假定是安全的。

【讨论】:

  • 感谢@zatopek 的回复,如果是单例bean,我们不需要在Spring中显式同步这些服务层方法吗?
  • 如果他们不访问任何共享资源则不需要,但如果他们确实访问超出其方法范围的变量,则需要逐个评估。
猜你喜欢
  • 2015-09-18
  • 2017-04-05
  • 2018-08-05
  • 2012-01-04
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2017-02-12
  • 2013-05-16
相关资源
最近更新 更多