ApplicationContext

article/2025/11/1 11:48:03

如果说BeanFactory是Spring的心脏,那么Application就是完整的身躯。ApplicationContext就是由BeanFactory派生出来的。

1、ApplicationContext

ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统加载文件。

如果配置文件放在类路径下,直接使用ClassPathXmlApplicationContext实现类:

ApplicationContext ctx=new ClassPathXmlApplicationContext("com/techman/context/beans.xml");

这里的参数等同于:"classpath:com/techman/context/beans.xml"

如果配置文件在文件系统的路径下,则可以优先考虑使用FileSystemXmlApplicationContext实现类:

ApplicationContext ctx=new FileSystemXmlApplicationContext("com/techman/context/beans.xml");

这里的参数等同于:"file:com/techman/context/beans.xml".

还可以指定一组配置文件,Spring自动将多个配置文件在内存中整合成一个配置文件:

ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"conf/bean1.xml","conf/bean2.xml"});

2、AnnotationConfigApplicationContext

直接实例:

  1. [java] view plaincopyprint?
  2. package com.techman.context;  
  3.   
  4. import org.springframework.context.annotation.Bean;  
  5. import org.springframework.context.annotation.Configuration;  
  6.   
  7. import com.techman.reflect.Car;  
  8.   
  9.   
  10.   
  11. @Configuration //表示是一个配置信息提供类,这里是通过类注解的配置方式  
  12. public class Beans   
  13. {  
  14.     @Bean(name="car")  
  15.     public Car buildCar()  
  16.     {  
  17.         Car car=new Car();  
  18.         car.setBrand("红旗CA72");  
  19.         car.setMaxSpeed(340);  
  20.           
  21.         return car;  
  22.     }  
  23. }  
复制代码




  1. [java] view plaincopyprint?
  2. package com.techman.context;  
  3.   
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext;  
  6.   
  7. import com.techman.reflect.Car;  
  8. //这里需要spring-context.jar和spring-expression.jar的支持  
  9. public class AnnotationApplicationContext   
  10. {  
  11.     public static void main(String []args)  
  12.     {  
  13.         //通过一个带@Configuration的POJO装载Bean配置  
  14.         ApplicationContext ac=new AnnotationConfigApplicationContext(Beans.class);  
  15.         Car car=ac.getBean("car",Car.class);  
  16.         car.introduce();  
  17.     }  
  18. }  
复制代码



AnnotationConfigApplicationContext将加载Beans.class中的Bean定义并调用Beans.class中实现的方法实例化Bean,启动容器并装配Bean.
3、WebApplicationContext

WebApplicationContext是专门为Web应用准备的,它允许从相对于web根目录的路径中加载配置文件完成初始化工作。


WebApplicationContext扩展了ApplicationContext,WebApplicationContext定义了一个常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,在上下文启动时,我们可以直接通过下面的语句从web容器中获取WebApplicationContext:

WebApplicationContext wac=(WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

4、ConfigurableWebApplicationContext

ConfigurableWebApplicationContext扩展了WebApplicationContext,它允许通过配置的方式实例化WebApplicationContext,它定义了两个重要的方法:

setServletContext(ServletContext servletContext):为Spring设置Web应用上下文,以便两者整合。

setConfigLocation(String[] configLocations)设置Spring配置文件地址,一般情况下,配置文件地址是相对于Web根目录的地址,如/WEB-INF/techman-dao.xml等。也可以使用classpath:com/techman/context/techman-dao.xml等格式。

5、Spring为使用WebApplicationContext的Servlet和Web容器监听器:

org.springframework.web.context.ContextLoaderServlet;

org.springframework.web.context.ContextLoaderListener;

这里是web.xml启动WebApplicationContext的配置:

  1. [html] view plaincopyprint?
  2. <!-- 从类路径下加载Spring配置文件,classpath关键字特指类路径下加载 ,如果多个文件则使用逗号或空格隔开-->  
  3.   <context-param>  
  4.     <param-name>contextConfigLocation</param-name>  
  5.     <param-value>classpath:applicationContext.xml,/WEB-INF/techman-dao.xml</param-value>    
  6.   </context-param>  
  7.     
  8.   <!-- 负责启动Spring容器的监听器,它将引用上面的上下文参数获得Spring配置文件地址 -->  
  9.   <listener>  
  10.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  11.   </listener>  
复制代码




如果在不支持容器监听器的低版本Web容器中,我们可采用ContextLoaderServlet完成相同的工作:

  1. [html] view plaincopyprint?
  2. <!-- 从类路径下加载Spring配置文件,classpath关键字特指类路径下加载 ,如果多个文件则使用逗号或空格隔开-->  
  3.   <context-param>  
  4.     <param-name>contextConfigLocation</param-name>  
  5.     <param-value>classpath:applicationContext.xml,/WEB-INF/techman-dao.xml</param-value>    
  6.   </context-param>  
复制代码




  1. [html] view plaincopyprint?
  2. <servlet>  
  3.     <servlet-name>springContextLoaderServlet</servlet-name>  
  4.     <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>  
  5.     <load-on-startup>1</load-on-startup>  
  6. </servlet>  
复制代码




6、Log4j的配置

由于WebApplicationContext需要使用日志功能,用户可以将log4j.properties放置在类路径下,这样就会自动启动。如果放在其他地方,必须在web.xml中指定Log4j配置文件的位置。Spring为启动Log4j引擎提供了两个类og4jConfigServlet和Log4jConfigListener,不管哪种方式都必须保证能够在装载Spring配置文件前先装载Log4J配置信息。

  1. [html] view plaincopyprint?
  2. <context-param>  
  3.     <param-name>log4jConfigLocation</param-name>  
  4.     <param-value>/WEB-INF/log4j.properties</param-value>    
  5.   </context-param>  
  6.   <servlet>  
  7.     <servlet-name>log4jConfigServlet</servlet-name>  
  8.     <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>  
  9.     <load-on-startup>1</load-on-startup>  
  10.   </servlet>  
复制代码




7、使用标注@Configuration的Java类提供配置信息

方式如下:

  1. [html] view plaincopyprint?
  2. <!-- 通过指定context参数,让Spring使用AnnotationConfigWebApplicationContext而非XmlWebApplicationContext启动容器 -->  
  3.   <context-param>  
  4.     <param-name>contextClass</param-name>  
  5.     <param-value>  
  6.         org.springframework.web.context.support.AnnotationConfigWebApplicationContext  
  7.     </param-value>  
  8.   </context-param>  
  9.     
  10.   <!-- 指定标注了@Configuration的配置类,多个可以使用逗号或空格分隔 -->  
  11.   <context-param>  
  12.     <param-name>contextConfigLocation</param-name>  
  13.     <param-value>com.smart.Beans,com.smart.AppConfig2</param-value>  
  14.   </context-param>  
  15.     
  16.   <!-- ContextLoaderListener监听器将根据上面的配置使用AnnotationConfigWebApplicationContext根據contextConfigLocation指定的配置類啟動Spring容器 -->  
  17.   <listener>  
  18.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  19.   </listener>  
复制代码

http://bbs.codeweb.cn/thread-5887-1-1.html





http://chatgpt.dhexx.cn/article/UdOJckW2.shtml

相关文章

ActionContext

1、ActionContext翻译成中文就是Action的上下文&#xff08;为什么说是上下文&#xff0c;是应为他的生命周期长&#xff0c;和我们的项目的生命周期是相同的&#xff0c;我们很多公共的东西都放在里面&#xff0c;方便存取 &#xff09;&#xff0c;ActionContext是struts2的上…

readonly option is set (add ! to override)错误的解决

在mac电脑或linux系统中经常操作修改某个文件后保存退出出现readonly option is set (add ! to override)。如图&#xff1a; 正常情况下按 A进入编辑模式修改文件后按ESC退出编辑模式&#xff0c;:wq命令保存退出&#xff0c;但经常会遇到以上显示&#xff0c;文件权限只读或者…

ByteBuffer的allocate和allocateDirect

在Java中当我们要对数据进行更底层的操作时&#xff0c;通常是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时常常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; Java代码 public static ByteBuffer allocate(int capacity…

直接内存 直接内存的释放和回收

直接内存 特点 不属于Java虚拟机管理&#xff0c;属于系统内存&#xff1b;属于操作系统&#xff0c;常见于NIO操作时&#xff0c;比如ByteBuffer【】用于数据缓冲区分配回收成本较高&#xff0c;但读写性能高&#xff1b;不受JVM内存回收管理 文件读写过程 java不具备磁盘…

解决The‘Access-Control-Allow-Origin‘ header contains multiple values‘*, ....‘, but only one is allowed

报错内容&#xff1a; Access to XMLHttpRequest at ‘http://www.z…n.com/api/login’ from origin ‘http://z…n.com’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values ‘*, http://z…n.com’, but only one is …

C++中std::allocator的使用

标准库中包含一个名为allocator的类&#xff0c;允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。 new有一些灵活性上的局限&#xff0c;其中一方面表现在它将内存分配和对象构造组合在了一起。类似的&#xff0c;delete将对象析构和内…

alloc的流程

1⃣️ 2⃣️ 3⃣️ 现在我们看的objc源码都是2.0的版本&#xff0c;之前还有一个1.0的版本 4⃣️ 5⃣️核心方法 最主要的就是最下面三个方法 他的最重要作用就是开辟内存 cls->instanceSize 先计算出需要的内存空间大小这个大小只和对象的成员变量有关 在没有成员变量…

ByteBuffer.allocate()与allocateDirect()的区别

allocate()产生的是HeapByteBuffer的实例, 本质上是一个no direct buffer, allocateDirect()产生的是DirectByteBuffer的实例, 本质是一个direct buffer 主要区别 buffer的创建方式不同, no direct buffer还可以通过封装已存在的byte array来产生执行IO操作时不同, no direct …

ByteBuffer常用方法与分析

目录 目标 常用API 工具方法 演示案例 allocate(int capacity)和allocateDirect(int capacity) put()和get() flip()和hasRemaining() clear() compact() wrap() 总结 目标 掌握ByteBuffer常用方法&#xff0c;分析ByteBuffer对象在切换读写模式的情况下基本属性的变…

allocate与allocateDirect的性能测试

allocate与allocateDirect的性能测试 测试工具JMH测试代码JMH结果结论 测试工具JMH java基准测试框架 测试代码 直接分配系统内存(allocateDirect) -测试申请内存性能JVM堆分配内存(allocate)-测试申请内存性能直接内存-操作-连续二十次添加(allocateDirect)-测试内存操作性能…

ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别

在Java中当我们要对数据进行更底层的操作时&#xff0c;一般是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; public static ByteBuffer allocate(int capacity) public s…

8、ByteBuffer(方法演示2(allocate堆内存和allocateDirect直接内存))

ByteBuffer&#xff08;方法演示2&#xff08;allocate堆内存和allocateDirect直接内存&#xff09;&#xff09; Allocate&#xff1a;java堆内存:读写效率低&#xff0c;收到gc的影响&#xff08;因为我们的java对象也是存在堆内存的&#xff09; &#xff01;&#xff01;…

03 Java NIO allocateDirect()和allocate()区别

03 Java NIO allocateDirect和allocate区别 allocateDirect()和allocate()区别直接与非直接缓冲区直接与非直接缓冲区 源码分析 allocateDirect()和allocate()区别 allocateDirect&#xff1a;分配直接缓冲区&#xff0c;将缓冲区简历在物理内存中&#xff0c;可以提交效率 all…

ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。

在Java中当我们要对数据进行更底层的操作时&#xff0c;一般是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; public static ByteBuffer allocate(int capacity) public …

ByteBuffer中的allocate和allocateDirect

1、区别 allocate方法创建的内存在jvm的管理范围&#xff0c;而allocateDirect方法创建的内存不由jvm管理&#xff0c;意思就是allocateDirect创建的内存由系统直接管理 2、释放 allocateDirect创建的内存不归jvm管理&#xff0c;那如何释放呢&#xff1f;虽然这块内存不属于…

NIO ByteBuffer的allocate与allocateDirect区别(HeapByteBuffer与DirectByteBuffer的区别)

参考&#xff1a;https://blog.csdn.net/zhxdick/article/details/81084672 其中allocateDirect分配的字节缓冲区用中文叫做直接缓冲区&#xff08;DirectByteBuffer&#xff09;&#xff0c;用allocate分配的ByteBuffer叫做堆字节缓冲区(HeapByteBuffer).. 其实根据类名就可…

【系统分析师】论文

文章目录 一、论文框架二、相关素材概览2.1 常见开发模型2.2 SOA架构 三、注意事项3.1 岗位职责3.2 项目背景3.3 理论部分讨论3.4 主体内容3.5 结论部分 四、范文4.1 开发模型主题反例正例 4.2 需求获取技术反例正例 4.3 系统测试反例正例 4.4反例正例 一、论文框架 二、相关素…

系统分析员论文12篇合集

系分论文1 企业人事信息系统的应用 【摘要】 本文讨论《企业人事信息系统》项目的需求分析方法与工具的选用。该系统的建设目标是帮助该企业管理好企业内部的人员和人员的活动&#xff0c;人事信息管理指的是企业员工从招聘面试到离职退休的全过程&#xff0c;涉及的主要活动…

系统分析师近几年论文走向

下面是整理的近几年的系统分析师考试论文题目