zoukankan      html  css  js  c++  java
  • web 工程中利用Spring的 ApplicationContextAware接口自动注入bean

    最常用的办法就是用 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 id="springContextHolder" class="××××××.SpringContextHolder" lazy-init="false" />



    2.对于java工程,ApplicationContextAware的意义不是很大,因为普通java工程没有办法象web应用启动的时候,加载spring的上下文。所以,还是应用程序手动创建方便。

  • 相关阅读:
    第四周作业
    第三周作业
    第二周作业
    20162325 2016-2017-2 《程序设计与数据结构》课程总结
    实验五 网络编程与安全 实验报告
    实验四 Android程序设计-5
    结对编程项目-四则运算 挑战出题
    20162325金立清 实验四 Android程序设计 实验报告
    20162325 结对编程项目-四则运算 整体总结
    实验三 敏捷开发与XP实践 实验报告
  • 原文地址:https://www.cnblogs.com/wnlja/p/3907126.html
Copyright © 2011-2022 走看看