创建服务
来源:JHipster |
时间:2018-11-04
|
|

介绍

此生成器相对于实体类生成器简单的多。

此生成器生成你应用程序的业务逻辑的spring service对象,如:

jhipster spring-service Bar

这将会生成BarService.生成的代码行数很少,但通常会有一些问题。

为什么service class不通过实体类生成器生成?

我们这里有两个主要的架构原则:

  • 我们不想推广无用的服务,如果你仅需要一个基础的CURD操作,那么是不需要service对象的,这也是为什么Jhipster不生成他们的原因

  • 我们认为service bean 应该比repository的粒度更粗,service bean使用多个repository来实现他们的业务价值,所以Service没有和实体类一起生成

我们Service应该使用interface吗?

简单的说:不需要!

如果需要详细的解释,那么:

一个主要的兴趣点是使用Spring AOP,这个技术允许Spring添加一些行为在你的Bean之上:对于实力而言,提供了诸如事务控制、安全的工作等。

为了增加这写行为,spring需要为你累创建一个代理,一般由两种方式创建代理:

  • 如果你使用的接口,spring将会使用Java提供的标准机制来创建动态代理

  • 如果你没有使用接口,Spring将会使用CGLIB来生成一个新的类:这不是Java的标准机制,但是它比标准机制工作的要好

很多人的争论点之一是使用接口易于编写测试用例,但是我们详细我们不应该为了测试用例儿修改我们的产品代码,并且还有一些新的mock框架(如EasyMock)允许我们不用接口创建一些有些的单元测试用例。

因此,最终我们发现接口对于我们的Service Bean通常是无用的,所以我们不推荐使用(但我们任务提供了生成接口的选项)

为什么我们应该使用事务来延迟加载JPA的关系?

默认JPA使用延迟加载一对多和多对多的实体关系,如果你使用默认配置,你将很可能看到LazyInitializationException:这意味着你尝试在事务外使用未初始化的关系。

由于生成的service class默认使用了@ Transactional注解,所有的方式都具有事务性,这意味着你可以再方法内获取所需的延迟加载的关系了,不用担心出现LazyInitializationException

提示:如果你不修改数据时在方法上使用@Transactional(readOnly = true)。这是一个比较好的性能优化方式(hibernate不需要刷新一级缓存,因为我们没有修改任何数据)以及使用一些JDBC驱动时质量的提升(Oracle不允许发送INSERT/UPDATE/DELETE命令)

可以给Service Bean添加权限控制吗?

仅需要在类或者方法上添加@Secured注解即可限制用户的访问权限。

可以监控Service Bean吗?

仅需在方法上添加注解@Timed即可。


提交
查看更多评论
没有更多评论