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

时间: 2024-10-10 14:50:58

spring 代码中获取ApplicationContext(@AutoWired,ApplicationListener)的相关文章

spring中获取applicationContext

常用的5种获取spring 中bean的方式总结: 方法一:在初始化时保存ApplicationContext对象代码:ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");ac.getBean("beanId");说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况. 方法二:通过Spring提供

spring中获取applicationContext(2)

前几天写web项目的时候,用到了spring mvc. 但是又写bean.我要在代码里面生成,而这个bean里面,又有一些属性是通过spring注入的. 所以,只能通过ApplicationContext来获取. 在servlet里面获取ApplicationContext其实可以通过spring提供的方法: ? 1 WebApplicationContextUtils.getWebApplicationContext(ServletContext) 来获取. 这个方法前提是要在web.xml里

spring里头各种获取ApplicationContext的方法

原文出处: xieyu_zy 为啥写这个文章呢?spring各个版本不同,以及和系统框架套在一起不同,导致获取的方式不同,网络上各种版本,太乱了,写获取方式的人都不写这个获取方式是在本地还是在WEB,在那种应用服务器下,在spring那个版本下,太过分了! 我这写一些,常见的,可能经常要用的版本: 首先了解,为什么要获取这个东西:当你想通过spring获取一个你指定的类的实例的时候,而又没有通过spring加载到当前调用的类里面,例如你在filter里面,可能要对人员角色做判定,此时还没到业务层

java代码中获取进程process id(转)

另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进程process id, 实现方法如下所示:    参考: rednaxelafx.iteye.com/blog/716918 http://www.cnblogs.com/mumuxinfei/p/3678854.html

获取存储过程返回值及代码中获取返回值

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: D

Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件

这篇的内容很简单,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个按钮分别命名了吧? 现在要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/918 文章来源:笨木头与游戏开发 根据名字查找控件 首先给TollgateScene再include一些头文件,不然等会编译又报错了: #include "editor-support/cocostudio/CCSGUIReader.h&quo

Java代码中获取Json的key值

测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym4iTZ3-ptWRRoVtbCNJnyjGLfed_4bB0HiqGP8v-aXOJUUk1tFs","expires_in":7200,"refresh_token":"_or_31yEp8XhxGWvrAzdWIkXfFlKjfb3iTRpfa

在ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串

  1.在<connectionStrings> 标签里添加连接 <connectionStrings> <add name="ConnectionName" connectionString="Server=.\SQLEXPRESS;Database=DatabaseName;UserID=sa;Password=abc123" providerName="System.Data.SqlClient" />

Spring在代码中获取bean的几种方式(转:http://www.dexcoder.com/selfly/article/326)

方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口ApplicationContextAware 方法六:通过Spring提供的ContextLoader 获取spring中bean的方式总结: 方法一:在初始化时保存Applicati