news 2026/4/1 20:22:26

深度详解Spring Context

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度详解Spring Context

深度详解Spring Context

每个Spring开发者都离不开Context,但你真的了解它吗?

引言:Spring Context 的核心地位

Spring Context作为Spring框架的核心组件,是IoC容器的具体实现。它就像一个巨大的工厂,负责管理所有的Bean对象,控制它们的生命周期,并解决它们之间的依赖关系。

什么是Spring Context?

Spring Context是Spring框架的核心容器,它继承自BeanFactory接口,但在其基础上增加了企业级应用所需的功能:

  • 国际化支持
  • 事件传播机制
  • 资源加载
  • AOP集成
  • 事务管理

四大ApplicationContext全解析

1️⃣ AnnotationConfigApplicationContext - Java配置的王者

适用场景:

  • 现代Spring Boot应用
  • 纯Java配置的项目
  • 需要类型安全的配置

核心特点:

  • 完全基于注解的配置方式
  • 支持Java 8的Lambda表达式
  • 与Spring Boot无缝集成

实战代码示例:

@Configuration @ComponentScan("com.example.service") @PropertySource("classpath:application.properties") public class AppConfig { @Value("${app.name}") private String appName; @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public UserService userService() { return new UserServiceImpl(); } @Bean public DataSource dataSource() { HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); dataSource.setUsername("root"); dataSource.setPassword("password"); return dataSource; } } public class MainApplication { public static void main(String[] args) { // 创建上下文 ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 获取Bean UserService userService = context.getBean(UserService.class); DataSource dataSource = context.getBean(DataSource.class); // 使用服务 userService.processUser(); } }

生产环境应用:在Spring Boot项目中,我们通常通过@SpringBootApplication注解自动创建AnnotationConfigApplicationContext

@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }

2️⃣ ClassPathXmlApplicationContext - 类路径XML配置

适用场景:

  • 传统Spring应用
  • 需要与XML配置兼容
  • 类路径资源管理

核心特点:

  • 从类路径加载XML配置文件
  • 支持通配符配置
  • 兼容性好

实战代码示例:

public class XmlConfigApp { public static void main(String[] args) { // 1. 基础用法 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 2. 多配置文件 String[] configLocations = { "spring-datasource.xml", "spring-service.xml", "spring-mvc.xml" }; ApplicationContext context2 = new ClassPathXmlApplicationContext(configLocations); // 3. 使用通配符 ApplicationContext context3 = new ClassPathXmlApplicationContext("classpath*:spring/*.xml"); // 获取Bean UserService userService = context.getBean(UserService.class); } }

XML配置文件示例:

<!-- applicationContext.xml --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 组件扫描 --> <context:component-scan base-package="com.example"/> <!-- 属性文件 --> <context:property-placeholder location="classpath:application.properties"/> <!-- 数据源配置 --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="${db.driver}"/> <property name="jdbcUrl" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </bean> <!-- JPA配置 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.example.entity"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- 启用事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>

3️⃣ FileSystemXmlApplicationContext - 文件系统XML配置

适用场景:

  • 外部配置文件管理
  • 开发环境快速配置
  • 多环境部署

核心特点:

  • 从文件系统加载配置文件
  • 支持绝对路径
  • 便于外部配置管理

实战代码示例:

public class FileSystemConfigApp { public static void main(String[] args) { // 1. 使用绝对路径 ApplicationContext context1 = new FileSystemXmlApplicationContext( "C:/config/spring/applicationContext.xml"); // 2. 使用多个配置文件 String[] configPaths = { "/opt/spring/config/datasource.xml", "/opt/spring/config/service.xml" }; ApplicationContext context2 = new FileSystemXmlApplicationContext(configPaths); // 3. 相对路径(不推荐,路径不明确) ApplicationContext context3 = new FileSystemXmlApplicationContext("config/spring.xml"); // 使用上下文 UserService userService = context1.getBean(UserService.class); } }

最佳实践:

public class ConfigManager { private static final String CONFIG_DIR = System.getProperty("user.dir") + "/config"; public static ApplicationContext createApplicationContext(String profile) { String configPath = CONFIG_DIR + "/application-" + profile + ".xml"; return new FileSystemXmlApplicationContext(configPath); } public static void main(String[] args) { // 根据环境创建不同的上下文 String env = System.getProperty("spring.profiles.active", "dev"); ApplicationContext context = createApplicationContext(env); } }

4️⃣ WebApplicationContext - Web应用的守护神

适用场景:

  • Web应用开发
  • Spring MVC应用
  • Servlet容器集成

核心特点:

  • 继承自ApplicationContext
  • 提供Web特有的功能
  • 支持Servlet生命周期集成

Web.xml配置示例:

<!-- web.xml --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- Spring Context配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/root-context.xml /WEB-INF/spring/app-config.xml </param-value> </context-param> <!-- 监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Spring MVC配置 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web.xml>

Servlet集成示例:

// 自定义Servlet @WebServlet("/api/users") public class UserServlet extends HttpServlet { @Autowired private UserService userService; @Override public void init() throws ServletException { // 获取WebApplicationContext WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext( getServletContext()); // 手动注入(不推荐,应该使用注解) if (userService == null) { userService = context.getBean(UserService.class); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) { List<User> users = userService.getAllUsers(); // 返回JSON响应 } } // 使用注解的控制器 @Controller @RequestMapping("/api") public class ApiController { @Autowired private UserService userService; @GetMapping("/users") @ResponseBody public List<User> getUsers() { return userService.getAllUsers(); } }

生产环境实战:微服务架构中的Spring Context

微服务集成示例

// 用户服务 @Configuration @EnableEurekaClient @ComponentScan("com.example.user") public class UserServiceProvider { public static void main(String[] args) { SpringApplication.run(UserServiceProvider.class, args); } } // 订单服务 @Configuration @EnableEurekaClient @ComponentScan("com.example.order") public class OrderServiceProvider { public static void main(String[] args) { SpringApplication.run(OrderServiceProvider.class, args); } } // 公共配置 @Configuration @PropertySource("classpath:application-common.properties") public class CommonConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } @Bean public RedisConnectionFactory redisConnectionFactory() { return LettuceConnectionFactory.builder() .host("redis-server") .port(6379) .build(); } }

Spring Boot与Spring Cloud整合

@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public class MicroserviceApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceApplication.class, args); } @Bean public WebApplicationContext webApplicationContext() { return new AnnotationConfigWebApplicationContext(); } } // 服务实现类 @Service public class OrderServiceImpl implements OrderService { @Autowired private UserClient userClient; @Autowired private PaymentClient paymentClient; @Autowired private InventoryClient inventoryClient; @HystrixCommand(fallbackMethod = "createOrderFallback") @Override public Order createOrder(OrderDTO orderDTO) { // 1. 检查用户 User user = userClient.getUser(orderDTO.getUserId()); // 2. 检查库存 inventoryClient.checkInventory(orderDTO.getItems()); // 3. 创建订单 Order order = new Order(); // ... 设置订单信息 // 4. 处理支付 PaymentResult payment = paymentClient.processPayment(order); return orderRepository.save(order); } public Order createOrderFallback(OrderDTO orderDTO) { // 降级处理 Order order = new Order(); order.setStatus("FAILED"); return order; } }

性能优化与最佳实践

1. 上下文加载优化

// 延迟加载 @Configuration public class OptimizedConfig { @Lazy @Bean public HeavyService heavyService() { return new HeavyService(); } @Bean @Primary @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON, proxyMode = ScopedProxyMode.TARGET_CLASS) public ExpensiveService expensiveService() { return new ExpensiveService(); } }

2. 内存管理

// 配置JVM参数 // 在启动脚本中添加: // -XX:+UseG1GC -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m // 配置Bean生命周期 @Configuration public class LifecycleConfig { @Bean(destroyMethod = "cleanup") public ResourceCleanup resourceCleanup() { return new ResourceCleanup(); } @Bean @DependsOn("resourceCleanup") public MainService mainService() { return new MainService(); } }

3. 多环境配置

// application-dev.properties spring.datasource.url=jdbc:mysql://dev-db:3306/mydb spring.datasource.username=dev_user spring.datasource.password=dev_pass // application-prod.properties spring.datasource.url=jdbc:mysql://prod-db:3306/mydb spring.datasource.username=prod_user spring.datasource.password=${PROD_DB_PASSWORD} // application-test.properties spring.datasource.url=jdbc:mysql://test-db:3306/mydb spring.datasource.username=test_user spring.datasource.password=test_pass // 激活不同环境 java -jar app.jar --spring.profiles.active=prod

总结

四种ApplicationContext各有其适用场景:

  1. AnnotationConfigApplicationContext- 现代Java配置的首选
  2. ClassPathXmlApplicationContext- 传统XML配置的可靠选择
  3. FileSystemXmlApplicationContext- 外部配置管理的灵活方案
  4. WebApplicationContext- Web应用的专用容器

在实际开发中,推荐根据项目需求和技术栈选择合适的ApplicationContext实现方式,并注意性能优化和最佳实践的应用。

记住,Spring Context是Spring框架的核心,掌握它的使用将让你在Spring开发的道路上更加游刃有余!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/10 10:11:21

深度测评2026本科生AI论文平台TOP10:开题报告与文献综述全解析

深度测评2026本科生AI论文平台TOP10&#xff1a;开题报告与文献综述全解析 2026年本科生AI论文平台测评&#xff1a;如何选到最适合自己的写作助手 随着人工智能技术在学术领域的深入应用&#xff0c;越来越多的本科生开始借助AI论文平台完成开题报告与文献综述等关键环节。然…

作者头像 李华
网站建设 2026/3/13 16:19:29

拆解 TCP 协议:头部结构、序号机制与滑动窗口实战

一、 TCP 协议本质:数据的组织形式 所谓的“协议”,本质上就是通信双方约定好的一种数据组织格式。这就好比写信,信封上哪里写邮编、哪里写地址,必须按规定来,邮局才能识别。 在 C 语言中,TCP 头部其实就是一个结构体。虽然 PC 机内存默认采用小端存储(Little-Endian)…

作者头像 李华
网站建设 2026/4/1 3:17:00

大数据毕设项目推荐-基于机器学习的房子价值预测系统的设计与实现python房价预测系统的设计与实现【附源码+文档,调试定制服务】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华
网站建设 2026/3/16 9:20:43

大数据毕设项目:基于机器学习的房子价值预测系统的设计与实现(源码+文档,讲解、调试运行,定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华
网站建设 2026/3/13 8:24:05

大数据毕设选题推荐:基于python的机器学习房价预测可视化系统基于机器学习的房子价值预测系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华
网站建设 2026/3/31 0:15:48

阿里拿38K出来的大佬良心分享,熬夜整理10 万字详细Java面试笔记!

国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。这是由于互联网IT行业的求职者太多了&#xff0c;如果考察的是清一溜的算法题和设计题&#xff0c;那么会要求面试官有极高的技术水平&#xff0c;还要花大量的时间成本和精力。所以&#xff0c;八股文面试也…

作者头像 李华