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使用的一点心得。东西不多,希望对你有所帮助,欢迎留言交流。