我使用@Inject注入了一个实现类的接口

我用@Inject注入了一个实现类的接口

FlowProcessManager ;

也使用Aop将其添加了

Aop.addMapping(FlowProcessManager.class,FlowProcessService.class);

但是却无法获取FlowProcessManager实例,返回null值;在另外一个方法中,却可以获取。十分不解。

评论区

JFinal

2019-08-21 16:32

@Inject 注入并不是所有地方都可以使用,例如你自己写的工具类中就无法获取,需要使用:
Aop.get(...) 获取

@Inject 可以使用的地方如下:
1:Controller 中
2:Interceptor 中
3:Validator 中
4:以上三个组件注入的组件的子组件,例如:
MyController 中使用 @Inject Aaa 注入了 Aaa 对象, Aaa 中又使用了 @Inject Bbb 注入了 Bbb 对象,这样可以一直无限注入下去

简单说,只要是从上述三个组件开始注入的,就可以一直不停地注入下去

但是,假定你有一个 MyKit , 该类的实例化对象如果是在上述三个组件中注入的是可以的,否则需要使用 Aop.get(...)

上述机制的原因如下:
使用 @Inject 注入需要 jfinal 接管对象的创建,而 Controller、Interceptor、Validator 组件的创建本身就是 jfinal 接管的,所以在这三类组件中可以使用 @Inject

文档中已经说得很详细:
https://www.sojpt.com/doc/4-5
注意看红色字体强调的部分

思维炮弹

2019-08-22 10:18

@JFinal 按文档中的说法,我在controller中@Inject注入了 flowProcessActionManager(A)对象,然后在A的实例flowProcessActionService中@Inject注入flowProcessManager(B)对象,但是B无法获取它的实例。
文档中说明controller中注入A对象,那么可以在A对象中注入B对象,一直注入下去。

JFinal

2019-08-22 16:06

@思维炮弹 只要是从 Controller、Interceptor、Validator 这三个组件开始 @Inject 注入的,沿路下来,一直都可以 @Inject

我估计你没成功是别的原因,你是不是在 Controller 的父类中注入了,这个要配置:
me.setInjectSuperClass(true)

最后,注入功能默认是不开启的,需要你配置一下:
me.setInjectDependency(true);

思维炮弹

2019-08-22 16:38

@JFinal 这些都是配置了的,就是在controller该类中注入的

JFinal

2019-08-22 16:42

@思维炮弹 那只剩最后一招了,单步调试下 AopFactory 这个类,看看里面哪一步没有获到到注入类

我估计应该是是映射问题,例如映射错了之类的

思维炮弹

2019-08-23 10:34

@JFinal 没有映射错误,而且在另外一个类中,这个类是成功被注入的。

思维炮弹

2019-08-23 10:41

@JFinal 我在@Inject(A.class)配置了,也无法获取实例。只能Aop.get(A.class)才能获取到。

JFinal

2019-08-23 11:45

@思维炮弹 Aop.get(A.class) 能获取 @Inject(A.class) 无法获取,这肯定是你没有从 Controller、Interceptor 这条线一直 @Inject 注入下来