在Activiti中使用TaskListener時,若是是使用的類型是Class時,使用Spring是沒法自動注入須要的bean的,網上查了下,緣由是Acitivi引擎會在內部使用Class.newInstance(...)的方式建立一個該類的對象,這個對象不被Spring管理,因此Sping是沒法給這個對象注入咱們須要的beanjava
怎麼辦呢?使用ApplicationContext把須要的bean取出來手動賦值,簡單粗暴。web
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少的狀況下使用spring
讓Spring管理你的Listener類(一樣實現了TaskListener接口),好比說我有個MyListener交給Spring管理了,給這個類起名爲"myListener",配置方式以下圖ide
而後它就是個被Spring管理的Listener了spa