今日闲暇,阅读文档 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); } } }