spring 代码中获取ApplicationContext(@AutoWired,ApplicationListener)
2017年度全网原创IT博主评选活动投票:http://www.itbang.me/goVote/234
学习spring框架时间不长,一点一滴都得亲力亲为。今天忽然觉得老是通过@Autowired自动装载组件不太舒服,老是要到类下写注解。于是考虑直接获取ApplicationContext,调用getBean去获取自己想要的Bean实例。网上查了资料,一开始错了方向,通过加载xml的方式初始化ApplicationContext,真是可笑的过程,咱这也算明显的瞎搞。下面讲讲我现在学到的方案,两种:1、用@Autowired直接组装ApplicationContext;2、用ApplicationListener监听ContextRefreshedEvent事件,在上下文刷新完毕时,保存ApplicationContext到全局对象中。
一、用@Autowired直接组装ApplicationContext。比较简单,简单的贴下代码。
@Autowired ApplicationContext context; @RequestMapping(value = "/login2") public String login2(String name, Model model, HttpServletRequest request, HttpSession session) { context.getBean(RequestBean.class).printId();
二、用ApplicationListener监听ContextRefreshedEvent事件。个人比较喜欢这种实现,一来不必老写@Autowired注解,二来还能继续使用spring自动管理组件。
简单说明:ApplicationListener是一个应用事件观察者,可以监听ApplicationEvent的各种扩展类,这个很有意思,我们完全可以定义自己的事件,然后用ApplicationListener进行监听。下面附上一点源码
1、定义一个上下文管理工具(全局使用)
package simm.spring.common.utils; import org.springframework.context.ApplicationContext; /** * 上下文获取工具类 * @author wh-simm * */ public class ApplicationContextUtil { public static ApplicationContextUtil instance = new ApplicationContextUtil(); private ApplicationContext _context; private ApplicationContextUtil(){} public void init(ApplicationContext context){ _context = context; } public ApplicationContext getContext(){ return _context; } /** * 获取Bean * @param requiredType * @return */ public <T> T getBean(Class<T> requiredType){ return _context.getBean(requiredType); } }
2、实现上下文初始化完成或刷新的监听方法,进行ApplicationContext的获取与保存
package simm.spring.web.events; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Service; import simm.spring.common.utils.ApplicationContextUtil; @Service public class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { // TODO Auto-generated method stub if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")){ System.out.println("避免spring-servlet.xml跟appicationContext.xml两次加载"); } if(event.getApplicationContext().getParent()==null){ System.out.println("执行context上下文初始化"); ApplicationContextUtil.instance.init(event.getApplicationContext()); } } }
3、接下来展示新的调用方式。现在这个调用就再也不用考虑是否成功完成了@Autowired了,在业务代码里可以随意使用。有木有觉得一丝舒爽!
ApplicationContextUtil.instance.getBean(RequestBean.class).printId();
这就是我对ApplicationContext使用的一点心得。东西不多,希望对你有所帮助,欢迎留言交流。