通过ApplicationContextAware加载Spring上下文环境

简介: 在程序中每一次使用new ClassPathXmlApplicationContext时都会重新装载配置文件并实例化上下文bean。此时如果某些线程类也配置在该文件中,那么会造成做相同工作的线程被启动多次(包括web容器初始化时启动的以及new ClasspathXmlApplicationContext时启动的线程)。为了避免这种情况就需要用到ApplicationContextAw

在程序中每一次使用new ClassPathXmlApplicationContext时都会重新装载配置文件并实例化上下文bean。此时如果某些线程类也配置在该文件中,那么会造成做相同工作的线程被启动多次(包括web容器初始化时启动的以及new ClasspathXmlApplicationContext时启动的线程)。为了避免这种情况就需要用到ApplicationContextAware,通过它Spring容器会自动调用ApplicationContextAware接口中的setApplicationContext方法将把上下文环境对象注入进去

我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。

具体如下:

1.实现ApplicationContextAware接口:

[java]  view plain copy
  1. package com.bis.majian.practice.module.spring.util;  
  2.   
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.ApplicationContextAware;  
  6.   
  7. public class SpringContextHelper implements ApplicationContextAware {  
  8.     private static ApplicationContext context = null;  
  9.   
  10.     @Override  
  11.     public void setApplicationContext(ApplicationContext applicationContext)  
  12.             throws BeansException {  
  13.         this.context = applicationContext;  
  14.     }  
  15.       
  16.     public static Object getBean(String name){  
  17.         return context.getBean(name);  
  18.     }  
  19.       
  20. }  

2.在Spring的配置文件中配置这个类,Spring容器会在加载完Spring容器后把上下文对象调用这个对象中的setApplicationContext方法:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  6.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  7.     http://www.springframework.org/schema/tx   
  8.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
  9.     http://www.springframework.org/schema/context   
  10.     http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byName">  
  11.       
  12.     <bean id="springContextHelper" class="com.bis.majian.practice.module.spring.util.SpringContextHelper"></bean>  
  13.       
  14.     <context:component-scan base-package="com.bis.majian.practice.module.*" />  
  15. </beans>  

3.在web项目中的web.xml中配置加载Spring容器的Listener:

[html]  view plain copy
  1. <!-- 初始化Spring容器,让Spring容器随Web应用的启动而自动启动 -->  
  2.     <listener>  
  3.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  4.     </listener>  

4.在项目中即可通过这个SpringContextHelper调用getBean()方法得到Spring容器中的对象了。

目录
相关文章
|
3月前
|
XML Java 数据格式
Spring 应用上下文探秘:生命周期解析与最佳实践
Spring 应用上下文探秘:生命周期解析与最佳实践
90 0
|
2月前
|
XML Java 数据格式
经验大分享:Spring基础篇——Spring容器和应用上下文理解
经验大分享:Spring基础篇——Spring容器和应用上下文理解
22 1
|
2月前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
31 3
|
3月前
|
Java 容器 Spring
Spring的加载配置文件、容器和获取bean的方式
Spring的加载配置文件、容器和获取bean的方式
38 3
Spring的加载配置文件、容器和获取bean的方式
|
2月前
|
XML Java 数据格式
应用上下文能否获取-spring13
应用上下文能否获取-spring13
|
2月前
|
缓存 运维 Java
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
27 0
|
3月前
|
Java Shell 测试技术
环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧
环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧
73 2
环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧
|
3月前
|
Java 关系型数据库 数据库
实时计算 Flink版产品使用合集之在集群上获取不到Spring的上下文是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
消息中间件 人工智能 Java
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
102 1