1 快速上手

2 JFinalConfig

3 Controller

4 AOP

5 ActiveRecord

6 Enjoy 模板引擎

7 EhCachePlugin

8 RedisPlugin

9 Cron4jPlugin

10 Validator

11 国际化

12 Json 转换

13 JFinal架构及扩展

14 升级到 4.5

4.5 Inject 依赖注入

? ? 使用 @Inject 注解可以向 Controller 以及 Interceptor 中注入依赖对象,使用注入功能需要如下配置:

public?void?configConstant(Constants?me)?{
????//?开启对?jfinal?web?项目组件?Controller、Interceptor、Validator?的注入
????me.setInjectDependency(true);
????
????//?开启对超类的注入。不开启时可以在超类中通过?Aop.get(...)?进行注入
????me.setInjectSuperClass(true);
}

? ? 以上的 me.setInjectDependency(true) 仅是针于 jfinal 的 web 组件而言的配置。而 Aop.get(...)、Aop.inject(...) 无需配置即可支持注入。

? ? 配置完成以后就可以在控制器中使用了,例如:

public?class?AccountController?{
???
???@Inject
???AccountService?service;????//?此处会注入依赖对象
???
???public?void?index()?{
???????service.justDoIt();????//?调用被注入对象的方法
???}
}


? @Inject 还可以用于拦截器的属性注入,例如:

public?class?MyInterceptor?implements?Interceptor?{
????
????@Inject
????Service?service;????//?此处会注入依赖对象
????
????public?void?intercept(Invocation?inv)?{
????????service.justDoIt();????//?调用被注入对象的方法
????????inv.invoke();
????}
}


特别注意:使用 Inject 注入的前提是使用 @Inject 注解的类的对象的创建是由 jfinal 接管的,这样 jfinal 才有机会对其进行注入。例如 Controller、Interceptor、Validator 的创建是 jfinal 接管的,所以这三种组件中可以使用 @Inject 注入。

此外:注入动作可以向下传递。例如在 Controller 中使用 @Inject 注入一个 AaaService,那么在 AaaService 中可以使用 @Inject 注入一个 BbbService,如此可以一直向下传递进行注入.


? ?如果需要创建的对象并不是 jfinal 接管的,那么可以使用 Aop.get(...) 方法进行依赖对象的创建以及注入,例如:

public?class?MyKit?{
???
???static?Service?service?=?Aop.get(Service.class);
???
???public?void?doIt()?{
??????service.justDoIt();
???}
}

? ? 由于 MyKit 的创建并不是 jfinal 接管的,所以不能使用 @Inject 进行依赖注入。 而 Controller、Interceptor 的创建和组装是由 jfinal 接管的,所以可以使用 @Inject 注入依赖。

? ?有了 Aop.get(...) 就可以在任何地方创建对象并且对创建的对象进行注入。此外还可以使用 Aop.inject(...) 仅仅向对象注入依赖但不创建对象。

? ? @Inject 注解还支持指定注入的实现类,例如下面的代码,将为 Service 注入 MyService 对象:

@Inject(MyService.class)
Service?service;

? ? 当被注入的对象是通过配置指定的,不能使用 @Inject(...) 指定参数的形式来指定被注入的类型时,还可以通过 AopManager.me().addMapping(...) 事先添加映射,例如:

AopManager.me().addMapping(Service.class,?MyService.class);

? ?通过上面的映射,下面的代码将会为 Service 注入 MyService

public?class?IndexController?{
????
????@Inject
????Service?service;
????
????public?void?index()?{
????????service.justDoIt();
????}
}