学习笔记 之 @Inject

今日闲暇,阅读文档 Inject注入,文档简洁明了。然感兴趣于所描述特别注意之“使用 Inject 注入的前提是使用 @Inject 注解的类的对象的创建是由jfinal接管的”,以controller为入口,查看了其源代码,以此笔记:

我们知道从JFinal顶层框架图得知,有关键的ActionHandler,在这创建了controller对象,如下

public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
    
    Controller controller = null;
    try { 
        controller = controllerFactory.getController(action.getControllerClass());
        controller._init_(action, request, response, urlPara[0]);
    }
}

继续查看 controllerFactory

public Controller getController(Class<? extends Controller> controllerClass) throws ReflectiveOperationException {
    Controller ret = controllerClass.newInstance();
    if (injectDependency) {
       com.jfinal.aop.Aop.inject(ret);
    }
    return ret;
}

可以看到,如果我们JFinalConfig 中配置了依赖注入就可以在controller中使用@Inject了

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

具体注入的关键方法如下

protected void doInject(Class<?> targetClass, Object targetObject) throws ReflectiveOperationException {

    Field[] fields = targetClass.getDeclaredFields();
    if (fields.length != 0) {
       for (Field field : fields) {
          Inject inject = field.getAnnotation(Inject.class);
          if (inject == null) {
             continue ;
          }

          Class<?> fieldInjectedClass = inject.value();
          if (fieldInjectedClass == Void.class) {
             fieldInjectedClass = field.getType();
          }

          Object fieldInjectedObject = doGet(fieldInjectedClass);
          field.setAccessible(true);
          field.set(targetObject, fieldInjectedObject);
       }
    }

}


评论区

热门分享

扫码入社