• Spring的ApplicationContext加载备忘


    最常用的办法就是用 ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 等对象去加载Spring配置文件,这样做也是可以, 但是在加载Spring配置文件的时候,就会生成一个新的ApplicaitonContext对象而不是Spring容器帮我们生成的哪一个, 这样就产生了冗余, 所以不采用应用程序手动加载文件的方式,而是使用ApplicationContextAware让Spring容器自动传递自己生成的 ApplicationContext到指定的类里。将来可以通过该类方便的访问spring的上下文。

    1web工程使用的ApplicationContextAware类:

    /**
    * 以静态变量保存Spring ApplicationContext,可在任意代码中取出ApplicaitonContext.
    *
    */
    public class SpringContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    /**
    * 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
    */
    public void setApplicationContext(ApplicationContext applicationContext) {
    SpringContextHolder.applicationContext =applicationContext;
    }


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

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

    /**
    * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
    */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<T> clazz) {
    checkApplicationContext();
    return (T) applicationContext.getBeansOfType(clazz);
    }

    private static void checkApplicationContext() {
    if (applicationContext == null)
    throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextUtil");
    }
    }

    同时需要在xml里定义这个bean,这样Spring在创建完ApplicationContext才会调用setApplicationContext(ApplicationContext applicationContext) 注入到类中,对于一些静态类由于无法使用注入而通过SpringContextHolder可以很方便的访问bean实例。

        <bean class="××××××.SpringContextHolder"     lazy-init="false" />



    2.对于java工程,ApplicationContextAware的意义不是很大,因为普通java工程没有办法象web应用启动的时候,加载spring的上下文。所以,还是应用程序手动创建方便。比如在main方法中通过ClassPathXmlApplicationContext来获取Bean,而不是通过注入,因为注入是实例变量。另外,ClassPathXmlApplicationContext即使使用了注解仍然可以访问到Bean。与使用注解与否无关。

  • 相关阅读:
    COCOS2D-X中UI动画导致闪退与UI动画浅析
    使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》
    algorithm 学习之 for_each
    cocos2dx 3.2 Touch Listen和menu回调实现截屏
    Lua 中string.gsub(sourceString, pattern, replacementString) 返回值有两个
    python 装饰器模式 我的理解
    Https SSL Knowledge & how to get a self-signed certificate on ubuntu.
    公钥和私钥的理解
    Openwrt UCI 快捷切换SS 配置
    iptables ipset 实用命令
  • 原文地址:https://www.cnblogs.com/highriver/p/2424001.html
Copyright © 2020-2023  润新知