关于AOP的一点问题

早之前我都是这么创建service的:public static final IndetailService me = Enhancer.enhance(IndetailService.class);

几天我看文档找了半天也没有对 Enhancer的介绍了,而且jfinal club里面也没有使用Enhancer了,而是都用了Aop.get(...),找了半天也没看到文档里面有介绍,不知道是推荐使用哪个呢。

还有个问题就是 jfinal club中都是使用的 @Inject 绑定的service,只有一些工具类中是用的Aop.get(...),但是我怎么觉得Aop.get(...)的方式 要比@Inject的方式清爽一些。我想知道波总是怎么理解这个的。多谢了波总~

评论区

要输就输给追求

2019-05-31 07:48

Aop.get和@Inject只是生效范围不一样。@Inject只能在Jfinal创建的对象中生效,而Aop.get任意地放都可以生效。他们的执行结果都是一样的

JFinal

2019-05-31 09:47

jfinal 高版本使用 Aop 、 @Inject 新功能完全代替了 Enhancer,所以相关文档也就改成了 Aop 、@Inject,但Enhancer、Duang 这两个工具类被保留下来,但其底层是在转调 Aop 的 API

从上可知,建议使用 Aop、@Inject,不建议使用 Enhancer

Aop、@Inject 各有优点,前者用于无法使用 @Inject 的地方,后者可以省代码,例如:
@Inject
Service service;

显然要比下面的代码要省:
Service service = Aop.get(Service.class);

尽可能去使用 @Inject ,省代码提升用户体验。 有些地方无法使用 @Inject ,这时就是 Aop.get(...) 出场的时候

@Inject 能被使用有个前提,那就是对象的创建是由 jfinal 负责的,例如 Controller 的创建是 jfinal 负责的,所以 Controller 中就可以使用 @Inject 注入业务层,由于业务层是在 controller 用 @Inject 注入的,进而在这种情况下 Service 的创建也是 jfinal 负责的,所以 Service 内部仍然可以继续使用 @Inject 一直注入下去

总有些对象的创建并不是 jfinal 接手的,例如 jfinal club 中的 AuthAdminKit , 所以它的内部就必须要使用 Aop.get(...)

mrbai2018

2019-05-31 10:38

假如我有10个业务类要引入下面这个service
@Inject
MyService service;
这个时候我就要在10个类中引入这句话;
--------------------------------------------------
可是如果我只在MyService中定义这一句话
public class MyService{
MyService service = Aop.get(MyService.class);
public void update(){
//
}
}

我就只需要在业务类中的具体方法中直接使用了
比如 :
public void test(){
MyService.service.update();
}

我想问的是这个区别,只是在我看来 下面这种更简单和清爽,想用的时候直接调用就行了。不用再翻到类的上面看看引入了哪些,没引入哪些。

JFinal

2019-05-31 15:57

@mrbai2018 第二种是用了一个 static 变量存放 MyService 自身,用起来区别不大,看个人习惯

mrbai2018

2019-05-31 16:46

谢了波总

JFinal

2019-05-31 21:10

@mrbai2018 建议的用法是:尽可能用 @Inject , 用不了 @Inject 的地方用上 Aop.get(...)

热门反馈

扫码入社