今天在开发的时候遇到一个问题,在工作流监听中用@Autowired 注入service的时候注入的是一个空
开始以为是漏写了没有把这个service扫描到后来发现并不是:
如果我们要在我们自己封装的Utils工具类中或者非controller普通类中使用@Autowired注解注入Service或者Mapper接口,直接注入是不可能的,因为Utils使用了静态的方法具体的修改方式如下
@Component
public class FlowTaskListener implements ExecutionListener{
@Autowired
private FlowTodoService flowTodoService;
public static FlowTaskListener flowTaskListener;
public FlowTaskListener() {
}
@PostConstruct
public void init() {
flowTaskListener = this;
flowTaskListener.flowTodoService = this.flowTodoService;
}
@Override
public void notify(DelegateExecution execution) throws Exception {
String businessKey = execution.getProcessBusinessKey();
if (!StringUtils.isEmpty(businessKey)) {
flowTaskListener.flowTodoService.endFlow(businessKey);
}
}
}
其中有3点是必须的首先 给类加上@Component
其次 被注入的类药写为public
第三用@PostConstruct 进行赋值
那么研究下@PostConstruct标签
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。