4.5 Inject 依赖注入

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

  1. public void configConstant(Constants me) {
  2. me.setInjectDependency(true);
  3. }

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

  1. public class AccountController {
  2.  
  3. @Inject
  4. AccountService service; // 此处会注入依赖对象
  5.  
  6. public void index() {
  7. service.justDoIt(); // 调用被注入对象的方法
  8. }
  9. }

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

  1. public class MyInterceptor implements Interceptor {
  2.  
  3. @Inject
  4. Service service; // 此处会注入依赖对象
  5.  
  6. public void intercept(Invocation inv) {
  7. service.justDoIt(); // 调用被注入对象的方法
  8. inv.invoke();
  9. }
  10. }

如果需要创建的对象并不是 Controller 的属性,也不是 Interceptor 的属性,还可以使用 Aop.get(…) 方法进行依赖对象的创建以及注入,例如:

  1. public class MyKit {
  2.  
  3. static Service service = Aop.get(Service.class);
  4.  
  5. public void doIt() {
  6. service.justDoIt();
  7. }
  8. }

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

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

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

  1. @Inject(MyService.class)
    Service service;

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

  1. Aop.addMapping(Service.class, MyService.class);

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

  1. public class IndexController {
  2.  
  3. @Inject
  4. Service service;
  5.  
  6. public void index() {
  7. service.justDoIt();
  8. }
  9. }

< 4.4 Clear

4.6 Aop 工具 >