activiti,我在任务监听TaskListener的实现类里想注入spring的bean要怎么做?我@Autowired注入都是null

sh_shinechou 发布于 2015/04/20 14:11
阅读 11K+
收藏 0
activiti,我在任务监听TaskListener的实现类里想注入spring的bean要怎么做?我@Autowired注入都是null
加载中
0
菜鸟先飞你敢信
菜鸟先飞你敢信
把实现类交给spring管理即可。
菜鸟先飞你敢信
菜鸟先飞你敢信
回复 @sh_shinechou : 用过,一个工作流引擎,交给spring管理不善只加那2个注解,你得把这个类在spring配置文件中配置下的。
s
sh_shinechou
加了@Service和@Transaction也不行,拿到的还是空。你用过activiti吗
0
battyman
battyman
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {

	private static ApplicationContext applicationContext = null;

	private static Logger LOGGER = Logger.getLogger(SpringContextHolder.class);

	/**
	 * 取得存储在静态变量中的ApplicationContext.
	 */
	public static ApplicationContext getApplicationContext() {
		assertContextInjected();
		return applicationContext;
	}

	/**
	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		LOGGER.debug("从SpringContextHolder中取出Bean:" + name);
		assertContextInjected();
		return (T) applicationContext.getBean(name);
	}

	/**
	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	public static <T> T getBean(Class<T> requiredType) {
		assertContextInjected();
		return applicationContext.getBean(requiredType);
	}

	/**
	 * 清除SpringContextHolder中的ApplicationContext为Null.
	 */
	public static void clearHolder() {
		LOGGER.debug("清除SpringContextHolder中的ApplicationContext:"
				+ applicationContext);
		applicationContext = null;
	}

	/**
	 * 实现ApplicationContextAware接口, 注入Context到静态变量中.
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) {
//		logger.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);

		if (SpringContextHolder.applicationContext != null) {
			LOGGER.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
		}

		SpringContextHolder.applicationContext = applicationContext; // NOSONAR
	}

	/**
	 * 实现DisposableBean接口, 在Context关闭时清理静态变量.
	 */
	@Override
	public void destroy() throws Exception {
		SpringContextHolder.clearHolder();
	}

	/**
	 * 检查ApplicationContext不为空.
	 */
	private static void assertContextInjected() {
		if(applicationContext == null) {
			throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
		}
	}


用法:

XxxService xxxlService = SpringContextHolder.getBean(XxxService.class);



0
s
sh_shinechou
解决了,TaskListener的实现类里面确实是拿不到Spring的bean的,它是后面new出来的对象,我用表达式Expression就可以使用Spring的bean了
0
大珊VIVIAN
大珊VIVIAN

这个表达式是指监听器的表达式吗?楼主,你是怎么写的表达式

s
sh_shinechou
你看一下我的博客,里面有专门处理activiti获取spring bean的
返回顶部
顶部