当前位置: 首页 > news >正文

Spring 上下文对象

1. Spring 上下文对象概述

     Spring 上下文对象(ApplicationContext)是 Spring 框架的核心接口之一,它扩展了 BeanFactory 接口,提供了更多企业级应用所需的功能。ApplicationContext 不仅可以管理 Bean 的生命周期和配置,还提供了以下高级功能:

              资源管理:从文件系统、类路径、URL 等位置加载资源。

              国际化支持:加载和管理多语言资源文件。

              事件机制:发布和处理应用事件。

              环境配置:支持不同环境下的配置管理。

               AOP 支持:支持面向切面编程(AOP)。

2. 主要功能详解及实例

      2.1 Bean 的创建和管理

            初始化

       ApplicationContext 会在应用启动时根据配置文件或注解创建和初始化 Bean。

                   支持多种配置方式,如 XML 配置文件、Java 配置类、注解等。

            依赖注入

                   自动装配 Bean 之间的依赖关系,支持构造器注入、设值注入、字段注入等多种方式。

            生命周期管理

                    管理 Bean 的生命周期,包括初始化、使用和销毁。

                    支持 InitializingBean 和 DisposableBean 接口,以及 @PostConstruct 和 @PreDestroy 注解。

示例代码

XML 配置文件 (applicationContext.xml):

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="myBean" class="com.example.MyBean"><property name="name" value="Spring Bean"/></bean></beans>

Java 类:

package com.example;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;public class MyBean {private String name;public void setName(String name) {this.name = name;}public void doSomething() {System.out.println("Doing something with " + name);}@PostConstructpublic void init() {System.out.println("Initializing " + name);}@PreDestroypublic void destroy() {System.out.println("Destroying " + name);}
}

主类:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {// 创建应用上下文ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取 BeanMyBean myBean = (MyBean) context.getBean("myBean");// 使用 BeanmyBean.doSomething();// 关闭应用上下文((ClassPathXmlApplicationContext) context).close();}
}
      2.2 资源管理
            资源加载

                   从文件系统、类路径、URL 等位置加载资源。

                   提供 Resource 接口和多种实现类,如 ClassPathResourceFileSystemResourceUrlResource 等。

            国际化支持

                   加载和管理多语言资源文件,支持 MessageSource 接口。

                   可以使用 ResourceBundleMessageSource 或 ReloadableResourceBundleMessageSource 实现多语言支持。

示例代码

消息资源文件 (messages.properties):

greeting=Hello, {0}!

消息资源文件 (messages_fr.properties):

greeting=Bonjour, {0}!

配置文件 (applicationContext.xml):

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="basename" value="classpath:messages"/><property name="defaultEncoding" value="UTF-8"/></bean></beans>

Java 类:

package com.example;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;import java.util.Locale;@Component
public class GreetingService {@Autowiredprivate MessageSource messageSource;public void greet(String name, Locale locale) {String greeting = messageSource.getMessage("greeting", new Object[]{name}, locale);System.out.println(greeting);}
}

主类:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {// 创建应用上下文ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取服务GreetingService greetingService = context.getBean(GreetingService.class);// 使用服务greetingService.greet("World", Locale.US);greetingService.greet("Monde", Locale.FRANCE);// 关闭应用上下文((ClassPathXmlApplicationContext) context).close();}
}
      2.3 事件发布和监听

            事件发布

                   允许应用发布事件,使用 ApplicationEvent 类及其子类表示事件。

                   通过 ApplicationContext 的 publishEvent 方法发布事件。

            事件监听

                   允许应用注册监听器来处理这些事件,使用 ApplicationListener 接口。

                   监听器可以实现 ApplicationListener<E extends ApplicationEvent> 接口,并重写 onApplicationEvent 方法。

示例代码

事件类:

package com.example;import org.springframework.context.ApplicationEvent;public class MyEvent extends ApplicationEvent {private String message;public MyEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}

事件监听器:

package com.example;import org.springframework.context.ApplicationListener;public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("Received custom event - " + event.getMessage());}
}

主类:

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class EventExample {public static void main(String[] args) {ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 注册事件监听器context.addApplicationListener(new MyEventListener());// 发布事件context.publishEvent(new MyEvent(EventExample.class, "Hello, World!"));// 关闭应用上下文context.close();}
}
      2.4 环境配置

            环境感知

                   支持不同环境下的配置管理,如开发环境、测试环境和生产环境。

                   可以通过 @Profile 注解指定 Bean 在哪些环境下生效。

                   使用 PropertyPlaceholderConfigurer 或 PropertySourcesPlaceholderConfigurer 加载外部配置文件。

示例代码

配置文件 (applicationContext.xml):

<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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="classpath:application-${spring.profiles.active}.properties"/><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${db.driver}" /><property name="url" value="${db.url}" /><property name="username" value="${db.username}" /><property name="password" value="${db.password}" /></bean></beans>

配置文件 (application-dev.properties):

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/dev_db
db.username=root
db.password=root

配置文件 (application-prod.properties):

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://prod-db-server:3306/prod_db
db.username=admin
db.password=securepassword

主类:

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.datasource.DriverManagerDataSource;public class MultiEnvExample {public static void main(String[] args) {// 设置环境变量System.setProperty("spring.profiles.active", "dev");// 创建应用上下文ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取数据源DriverManagerDataSource dataSource = context.getBean(DriverManagerDataSource.class);System.out.println("Data Source URL: " + dataSource.getUrl());// 关闭应用上下文context.close();}
}
      2.5 AOP 支持

            切面管理

                    支持面向切面编程(AOP),可以定义和应用切面。

                    使用 @Aspect 注解定义切面,使用 @Before@After@Around 等注解定义通知。

示例代码

配置类:

package com.example;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@EnableAspectJAutoProxy
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}@Beanpublic MyAspect myAspect() {return new MyAspect();}
}

切面类:

package com.example;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect
public class MyAspect {@Before("execution(* com.example.MyBean.doSomething(..))")public void beforeAdvice() {System.out.println("Before advice: Logging method entry");}@After("execution(* com.example.MyBean.doSomething(..))")public void afterAdvice() {System.out.println("After advice: Logging method exit");}
}

业务类:

package com.example;public class MyBean {public void doSomething() {System.out.println("Doing something...");}
}

主类:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AopExample {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MyBean myBean = context.getBean(MyBean.class);myBean.doSomething();}
}

3. 总结

     Spring 上下文对象是 Spring 框架的核心组件,提供了丰富的功能,包括 Bean 的创建和管理、资源管理、国际化支持、事件发布和监听、环境配置和 AOP 支持。通过使用这些功能,可以更好地管理和协调应用中的各种组件,提高应用的灵活性和可维护性。

http://www.lryc.cn/news/489795.html

相关文章:

  • Wireshark抓取HTTPS流量技巧
  • 测试人员--如何区分前端BUG和后端BUG
  • 【Vue】指令扩充(指令修饰符、样式绑定)
  • Ubuntu20.04 Rk3588 交叉编译ffmpeg7.0
  • HTML常用表格与标签
  • 网络安全与加密
  • MySQL数据库-索引的介绍和使用
  • 【图像去噪】论文精读:Pre-Trained Image Processing Transformer(IPT)
  • Java SE 与 Java EE:基础与进阶的探索之旅
  • ssm旅游推荐系统的设计与开发
  • 【人工智能】用Python和NLP工具构建文本摘要模型:使用NLTK和spaCy进行自然语言处理
  • 51c大模型~合集76
  • 资源控制器--laravel进阶篇
  • 对象:是什么,使用,遍历对象,内置对象
  • 设计模式:4、命令模式(双重委托)
  • DataWorks快速入门
  • EasyExcel并行导出多个excel文件并压缩下载
  • 圣诞节秘诀
  • 亚信安全发布《2024年第三季度网络安全威胁报告》
  • Long noncoding RNAs and humandisease
  • 嵌入式AI之rknn yolov5初探
  • 《Vue零基础入门教程》第三课:起步案例
  • 深入浅出C#编程语言
  • 游戏盾 :在线游戏的终极防护屏障
  • 工作中的问题记录笔记
  • 加载指定会话最近消息
  • 基于tensorflow使用VGG16实现猫狗识别
  • 第18章 EXISTS 与 NOT EXISTS 关键字
  • Windows多JDK版本管理工具JVMs
  • 【C++】初始化列表、类型转换