1.为什么使用AppplicationContextAware?

ApplicationContext的BeanFactory 的子类, 拥有更强大的功能,ApplicationContext可以在服务器启动的时候自动实例化所有的bean,而 BeanFactory只有在调用getBean()的时候才去实例化那个bean, 这也是我们为什么要得到一个ApplicationContext对象, 事实上Spring2相关的web应用默认使用的是ApplicationContext对象去实例化bean, 换一句话说, 在服务器启动的时候,Spring容器就已经实例化好了一个ApplicationContext对象,所以我们要在老的代码里尝试去获取这个对象。 但是如何才能得到一个ApplicationContext对象呢?方法很多,最常用的办法就是用ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 等对象去加载Spring配置文件,这样做也是可以, 但是在加载Spring配置文件的时候,就会生成一个新的ApplicaitonContext对象而不是Spring容器帮我们生成的哪一个, 这样就产生了冗余, 所以我们在这里不采用这种加载文件的方式,我们使用ApplicationContextAware让Spring容器传递自己生成的ApplicationContext给我们, 然后我们把这个ApplicationContext设置成一个类的静态变量, 这样我们就随时都可以在老的代码里得到Application的对象了。(转载自   https://blog.csdn.net/kouwoo/article/details/43405109)

2. ApplicationContextAware接口作用 ?

加载Spring配置文件时,如果Spring配置文件中所定义或者注解自动注入的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的方法:

public void setApplicationContext (ApplicationContext context) throws BeansException

3.如何实现的

首先创建工具类实现ApplicationContextAware

public class GetBeanInstance implements ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(GetBeanInstance.class);

    private static ApplicationContext applicationContext = null;

    /***
* 当继承了ApplicationContextAware类之后,那么程序在调用 getBean(String)的时候会自动调用该方法,不用自己操作
*/
public void setApplicationContext(ApplicationContext applicationContext) {
logger.info("setApplicationContext :::: " + applicationContext);
GetBeanInstance.applicationContext = applicationContext;
}
// 获取 bean
public static Object getBean(String beanName) {
try {
if(applicationContext == null){
logger.error("applicationContext is null");
}
return applicationContext.getBean(beanName);
} catch (Exception e) {
logger.warn("not fund bean [" + beanName + "]", e);
return null;
}
} @SuppressWarnings("unchecked")
public static <T> T getBean(String beanName, Class<T> clazz) {
return (T) getBean(beanName);
} public static Object getBeanThrowException(String beanID) {
return getBeanThrowException(beanID, Object.class);
} @SuppressWarnings("unchecked")
public static <T> T getBeanThrowException(String beanID, Class<T> clazz) { if (beanID == null || "".equals(beanID)) {
throw new IllegalArgumentException("beanID is empty [" + beanID + "]");
} try {
return (T) applicationContext.getBean(beanID);
} catch (Exception e) {
logger.error("not fund bean [" + beanID + "]", e);
throw new NullPointerException("not fund bean [" + beanID + "] !!!!!!!");
}
} }

然后配置 GetBeanInstance

 <bean id="GetBeanInstancesAPI" class="com.sinosoft.utility.GetBeanInstance" scope="singleton" lazy-init="false"  />

最后配置web.xml

因为spring要建立属于自己的容器,就必须要加载自己的配置文件。     这个时候,需要注册ContextLoaderListener或者这个类的子类。

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>   

当然,这样子的话只会读取默认路径下的application.xml配置文件的。如果需要读取特定路径下的配置文件。需要在web.xml中添加如下信息。

	<context-param>
<param-name>contextConfigLocation</param-name> //这行不允许改动
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>

  到这就就大功告成了。虽然还是迷迷糊糊,但总算是了解了一些知识。

最新文章

  1. IOS开发基础知识--碎片3
  2. [转]全面理解Unity加载和内存管理
  3. string int 转换
  4. BZOJ1036[ZJOI2008]树的统计Count 题解
  5. SubsetsTotal Accepted:49746Total Submissions:176257My Submissions
  6. How to load jars residing over NFS in JBossAS7 classpath ? --reference
  7. C程序第二章节:算法
  8. Java中的栈上分配
  9. Bat脚本自动卸载软件-静默执行
  10. 久未更 ~ 三之 —— CardView简单记录
  11. Hama顶点编程
  12. Android studio 2 版本升级 Android studio 3 版本注意事项
  13. python并发编程之多进程1-----------互斥锁与进程间的通信
  14. Django Web开发学习笔记(5)
  15. 分析攻击IP来源地并画出饼图
  16. GAE、SAE与BAE的对比分析(百度云)
  17. 【OT1.0 + TP3.2】开启trace调试、输出调试信息、开启自定义菜单
  18. sublime 个人心得
  19. 根据已有的Jar包 一键生成对应的mavenpom.xml信息
  20. 微信小程序------导航栏样式、tabBar导航栏

热门文章

  1. Python中函数的参数带星号是什么意思?
  2. Spark流式状态管理(updateStateByKey、mapWithState等)
  3. Proxy:简单小巧又强大好用的代理系统
  4. https中间人攻击
  5. js数组快速排序和冒泡排序
  6. CRT, lucas及其扩展形式
  7. 「IOI2017」接线 的另类做法
  8. Json处理方式记录
  9. STL——容器(deque) 构造 &amp; 头尾添加删除元素
  10. Notepad++ 使用步骤,熟练掌握notepad++的使用技巧,无疑会大大提升专业技能。以及快捷键操作