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进行监听。下面附上一点源码

       spring 代码中获取ApplicationContext(@AutoWired,ApplicationListener)

  spring 代码中获取ApplicationContext(@AutoWired,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使用的一点心得。东西不多,希望对你有所帮助,欢迎留言交流。