关于controller 注入service的通用c

刚开始使用框架时没有引入service层,直接在model写逻辑,后来咨询大家还是很有必要的,于是加了service 层,但是controller 中需要调用 service 而jfinal又没有spring 类似的注入方法,一开始看demo 是new 出来的,于是照着new了一个但是后来发现不行啊,不止一个地方用到 啊不能每次都去new 吧 浪费时间和内存,后来开始在社区找啊找,后来寻思是否可以写一个公共的注入器结果找资料的时候发现波总以前回答过类似这种问题如下:

对 jfinal 项目来说,业务层几乎是必须的,不带业务层的都是很小的项目应用场景,业务层做成无状态的,这样的话,内部可以持有一个全局变量,供所有地方直接使用,不用每次都创建 Service,

以下是一个 AccountService 的示例:
public class AccountService {
// 全局共享的业务对象,但要保障无状态,这样才是线程安全的
public static final AccountService me = Enhancer.enhance(AccountService.class);
// dao 对象只让本业务使用,其它要用它的地方统统在业务层创建方法来转调
private final Account dao = new Account();

@Before(Tx.class)
public class doIt() {
....
}
}

在Controller 中可以有两种对业务层的用法,以下是用法一:
public class AccountController {
private AccountService srv = AccoutService.me;
public void action() {
srv.doIt();
}

对于其它非 AccountController 以下是用法二:
public class OtherController {
public void action() {
// 直接使用 me 对象
AccountService.me.doIt();
}


按照我的理解是在service 层次通过该语句

public static final UserService me = Enhancer.enhance(UserService.class);

定义一个全局变量,

image.png

这样的话 在任何一个controller 中可以通过User service 直接就可以用调用类变量

image.png

而且该对象是单例的

这样的话就不用每次去创建一个新的对象了。不知道这样理解对不对。

但是如果只考虑单例的话这样写是否也可以呢?

image.png

评论区

JFinal

2017-09-27 16:10

如果用了 public static final Xxx me 并且配合 private 构造方法,则就会变成单例的,因为 private 构造方法可以阻止 new 出对象来

通常只要将业务层做成无状态的,让所有状态都放在数据库或者共享的中心缓存中,就可以使用这种模式

不仅省去了 IOC 容器、省去了大量的 XML 或 annotation 进行注入装配、提升了性能、减少了代码量,而且还无比简单好理解。

更重要一点就是:无状态的业务层,让分布式与集群变得无比方便,无状态的业务层为下一步的分布式与集群做好了充分的准备

喜欢自在

2017-09-27 18:37

慎用全局变量,方是方便,在性能上会是致命伤

JFinal

2017-09-27 20:22

@喜欢自在 文章中的用法性能没有问题

热门分享

扫码入社