一、手动注入
在Activiti中使用TaskListener时,如果是使用的类型是Class时,使用Spring是无法自动注入需要的bean的,网上查了下,原因是Acitivi引擎会在内部使用Class.newInstance(...)的方式创建一个该类的对象,这个对象不被Spring管理,所以Sping是无法给这个对象注入我们需要的bean
怎么办呢?使用ApplicationContext把需要的bean取出来手动赋值,简单粗暴。
package cn.lixuelong.demo;
import org.activiti.engine.IdentityService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.identity.Group;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.ContextLoader;
/**
* Created by long on 2017/12/5.
*/
public class AssigneeListenerImpl implements TaskListener {
public AssigneeListenerImpl() {
//从ApplicationContext中取到需要的bean,手动赋值
ApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
identityService = (IdentityService) context.getBean("identityService");
}
private IdentityService identityService;
@Override
public void notify(DelegateTask delegateTask) {
String taskName = delegateTask.getName();
String groupName;
if ("经理".equals(taskName)) {
groupName = "经理";
} else if ("客服".equals(taskName)) {
groupName = "客服";
} else {
return;
}
Group group = identityService.createGroupQuery().groupName(groupName).singleResult();
delegateTask.addCandidateGroup(group.getId());
}
}
方法笨了点,但是简单省事,适合在bean少的情况下使用
二、使用Expression方式
让Spring管理你的Listener类(同样实现了TaskListener接口),比如说我有个MyListener交给Spring管理了,给这个类起名为"myListener",配置方式如下图
然后它就是个被Spring管理的Listener了
来源:oschina
链接:https://my.oschina.net/u/2245754/blog/1585515