Spring模块详解Ⅱ

目录

  • Spring Beans
    • 模块详解
    • 1. 什么是 Bean?
    • 2. Spring Bean的配置方式
      • 2.1 基于 XML 配置
        • 例子:
      • 2.2 基于注解配置
        • 例子:
      • 2.3 基于 Java 配置(JavaConfig)
        • 例子:
    • 3. Bean 的生命周期
      • 生命周期回调的例子:
    • 4. Bean 的作用域
      • 例子:
    • 5. 依赖注入方式
      • 5.1 构造器注入
        • 例子:
      • 5.2 Setter 注入
        • 例子:
      • 5.3 字段注入
        • 例子:
    • 6. 自动装配(Autowiring)
      • 例子:
    • 7. Bean 的依赖关系
      • 例子:
    • 8. Bean 后置处理器(BeanPostProcessor)
      • 例子:
    • 总结
  • Spring Context
    • 1. 什么是 Spring Context?
    • 2. ApplicationContext 的主要实现
    • 3. 国际化支持
      • 国际化消息文件
      • 使用 `MessageSource`
        • XML 配置:
        • Java 配置:
      • 使用国际化消息:
    • 4. 事件处理机制
      • 核心接口与类:
      • 自定义事件:
      • 自定义监听器:
      • 发布事件:
    • 5. 资源访问
      • 获取资源:
    • 6. 生命周期管理
      • 生命周期回调:
      • 生命周期回调示例:
    • 7. Environment 抽象
      • 访问环境属性:
    • 8. ApplicationContext 的扩展
      • WebApplicationContext 示例:
    • 总结

Spring Beans

在这里插入图片描述

模块详解

Spring Beans 模块是 Spring 框架的核心部分之一,它主要负责 Bean(即应用程序中的对象)的定义、配置、创建、管理和销毁。Spring Beans 模块通过依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IoC)模式帮助开发者解耦对象之间的依赖关系,从而简化代码结构,提高可测试性和可维护性。

1. 什么是 Bean?

在 Spring 中,Bean 是指由 Spring IoC 容器管理的对象。Bean 是 Spring 应用程序的基本构造单元,通过配置文件或注解方式定义,Spring 容器根据这些定义来实例化、配置和管理这些对象。Bean 可以是任何 Java 对象,不仅限于简单的 POJO(Plain Old Java Object),它可以是复杂的业务逻辑对象、数据访问对象、服务对象等。

2. Spring Bean的配置方式

Spring 支持多种方式来配置 Bean,包括基于 XML 配置、基于注解配置以及基于 Java 配置(JavaConfig)。以下分别介绍每种方式的用法。

2.1 基于 XML 配置

XML 是 Spring 传统的配置方式。通过 XML 文件,我们可以定义 Bean 的类、属性、构造器注入、作用域等信息。
在这里插入图片描述

例子:
<!-- XML 配置 Bean -->
<bean id="myBean" class="com.example.MyBean"><!-- 使用 setter 方法注入 --><property name="name" value="Spring" />
</bean>

在这个例子中,Spring 容器会根据 XML 中的配置创建一个 com.example.MyBean 类的对象,并将 name 属性的值设置为 "Spring"

2.2 基于注解配置

基于注解的配置使用更为现代化,简化了 XML 配置的复杂性。开发者可以在 Java 类上直接使用注解来定义 Bean。

常见的注解有:

  • @Component:用于标注一个类为 Spring Bean,通常与自动扫描(Component Scanning)结合使用。
  • @Autowired:用于注入依赖,可以是字段注入、构造器注入或 setter 注入。
  • @Service@Repository@Controller:这些注解是 @Component 的特化,用于表示具体的层次(服务层、数据访问层、控制器层)。
    在这里插入图片描述
例子:
@Component
public class MyBean {private String name = "Spring";
}@Service
public class MyService {@Autowiredprivate MyBean myBean;
}

在这个例子中,MyBean 被标记为一个组件(@Component),并通过 @Autowired 注入到 MyService 类中。

2.3 基于 Java 配置(JavaConfig)

JavaConfig 是一种基于 Java 类的配置方式,开发者可以使用纯 Java 类来配置 Spring Bean。JavaConfig 通过标注配置类(@Configuration)和 Bean 方法(@Bean)来实现,避免了 XML 文件的使用。

例子:
@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}@Beanpublic MyService myService() {return new MyService(myBean());}
}

在这个例子中,AppConfig 是一个配置类,其中定义了两个 Bean(MyBeanMyService)。Spring 容器会根据配置类创建这些 Bean 并管理它们的生命周期。

3. Bean 的生命周期

Spring 容器负责管理 Bean 的整个生命周期,包括它的创建、初始化、使用、销毁等过程。Bean 的生命周期可以通过以下阶段描述:

  1. 实例化:Spring 容器根据配置实例化 Bean 对象。
  2. 依赖注入:Spring 容器通过构造器注入或 setter 注入,将所需的依赖对象注入到 Bean 中。
  3. 初始化:如果 Bean 实现了 InitializingBean 接口或配置了 init-method,Spring 容器会在 Bean 初始化时调用对应的方法。
  4. 使用:Bean 被应用程序使用。
  5. 销毁:当容器关闭时,如果 Bean 实现了 DisposableBean 接口或配置了 destroy-method,Spring 容器会调用销毁方法。

生命周期回调的例子:

@Component
public class MyBean implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("Bean 初始化");}@Overridepublic void destroy() throws Exception {System.out.println("Bean 销毁");}
}

在这里插入图片描述

4. Bean 的作用域

Spring 支持多种 Bean 的作用域,以控制 Bean 的生命周期和共享方式。常见的作用域包括:

  • singleton(默认):容器中只有一个单实例的 Bean,所有对该 Bean 的请求都返回同一实例。
  • prototype:每次请求时都会创建一个新的 Bean 实例。
  • request:为每个 HTTP 请求创建一个新的 Bean 实例(仅用于 Web 应用)。
  • session:为每个 HTTP 会话创建一个新的 Bean 实例(仅用于 Web 应用)。
  • application:为整个 ServletContext 创建一个 Bean 实例(仅用于 Web 应用)。

例子:

<bean id="myBean" class="com.example.MyBean" scope="prototype"/>

在这个例子中,myBean 是一个 prototype 范围的 Bean,因此每次请求这个 Bean 时,Spring 都会创建一个新的实例。

5. 依赖注入方式

Spring 提供了多种依赖注入方式,主要包括以下几种:

5.1 构造器注入

构造器注入是在 Bean 实例化时通过构造器将依赖传入。

例子:
<bean id="myBean" class="com.example.MyBean"><constructor-arg name="name" value="Spring" />
</bean>

5.2 Setter 注入

Setter 注入是在 Bean 实例化后,通过 Setter 方法将依赖注入。

例子:
<bean id="myBean" class="com.example.MyBean"><property name="name" value="Spring" />
</bean>

5.3 字段注入

字段注入是使用 @Autowired 注解直接在类的字段上进行注入。这种方式不需要通过 Setter 方法或者构造器来实现注入。

例子:
@Component
public class MyService {@Autowiredprivate MyBean myBean;
}

在这里插入图片描述

6. 自动装配(Autowiring)

Spring 提供了多种自动装配的方式,通过 @Autowired 注解或者 XML 配置,Spring 可以自动将依赖注入到所需的对象中。

自动装配的方式包括:

  • byType:按类型自动装配 Bean。
  • byName:按名称自动装配 Bean。
  • constructor:通过构造器进行自动装配。
  • autodetect:自动检测使用构造器注入或 setter 注入。

例子:

<bean id="myService" class="com.example.MyService" autowire="byType"/>

7. Bean 的依赖关系

Spring 支持通过配置来定义 Bean 之间的依赖关系。开发者可以在 XML 配置文件或 Java 配置类中显式指定某些 Bean 需要在其他 Bean 之前加载。

例子:

<bean id="beanA" class="com.example.BeanA"/>
<bean id="beanB" class="com.example.BeanB" depends-on="beanA"/>

在这个例子中,beanB 依赖于 beanA,Spring 容器会先实例化 beanA,再实例化 beanB

8. Bean 后置处理器(BeanPostProcessor)

BeanPostProcessor 是 Spring 提供的一个接口,允许开发者在 Bean 初始化之前和之后对 Bean 进行额外的处理。可以用于修改 Bean 实例或动态代理。

例子:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("Before Initialization: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("After Initialization: " + beanName);return bean;}
}

总结

Spring Beans 模块是 Spring 框架的核心模块,它负责对象的定义、配置、管理和生命周期处理。通过 IoC 和 DI 模式,Spring Beans 模块帮助开发者解耦对象间的依赖,简化了对象创建和管理
在这里插入图片描述

Spring Context

Spring Context 模块是 Spring 框架的一个重要模块,它建立在 Core 和 Beans 模块的基础之上,提供了更高级的特性,如国际化(I18N)、事件传播、资源管理、依赖注入(DI)、生命周期管理以及对 Java EE 特性的支持。它扩展了 BeanFactory,为应用程序提供了丰富的上下文环境。

1. 什么是 Spring Context?

ApplicationContext 是 Spring Context 模块的核心接口,它是 Spring IoC 容器的高级接口,扩展了基础的 BeanFactory 功能,不仅支持 Bean 的创建和管理,还提供了企业级的特性,例如:

  • 国际化(国际化消息)
  • 事件传播(监听和发布事件)
  • 资源访问(文件、URL、classpath 等)
  • 自动装配(基于注解和自动检测)

通过 ApplicationContext,Spring 应用程序能够管理 Bean 的生命周期、依赖关系、配置和运行时行为。
在这里插入图片描述

2. ApplicationContext 的主要实现

Spring 提供了多种 ApplicationContext 的实现,适用于不同的应用场景:

  • ClassPathXmlApplicationContext:从类路径下的 XML 配置文件中加载上下文。
  • FileSystemXmlApplicationContext:从文件系统中的 XML 配置文件中加载上下文。
  • AnnotationConfigApplicationContext:基于注解的配置上下文,通常用于基于 Java 配置的应用程序。
  • WebApplicationContext:用于 Web 应用的上下文,实现了 ApplicationContext,并集成了 Servlet 环境。

3. 国际化支持

ApplicationContext 提供了对国际化(I18N)的支持,允许开发者根据用户的区域设置信息提供不同语言的消息。Spring 通过 MessageSource 接口实现了对国际化消息的管理,可以在配置文件中或通过 Java 类来定义国际化消息。

国际化消息文件

国际化消息通常存储在 .properties 文件中,不同语言的消息文件名称会有所区别,例如:

  • messages.properties:默认语言
  • messages_en.properties:英文
  • messages_fr.properties:法语

使用 MessageSource

配置 MessageSource 来加载国际化消息:

XML 配置:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basename" value="messages" />
</bean>

在这里插入图片描述

Java 配置:
@Configuration
public class AppConfig {@Beanpublic ResourceBundleMessageSource messageSource() {ResourceBundleMessageSource source = new ResourceBundleMessageSource();source.setBasename("messages");return source;}
}

使用国际化消息:

@Autowired
private MessageSource messageSource;public void printMessage(Locale locale) {String message = messageSource.getMessage("greeting", null, locale);System.out.println(message);
}

通过 Locale 参数,开发者可以获取基于不同语言环境的消息。

4. 事件处理机制

Spring 的事件机制使得应用程序中的组件之间可以通过发布和监听事件进行松散耦合的通信。Spring 提供了简单且强大的事件处理机制,基于 Observer Design Pattern(观察者模式)。

核心接口与类:

  • ApplicationEvent:所有事件类的父类,开发者可以自定义事件,继承自该类。
  • ApplicationListener:事件监听器接口,开发者可以实现该接口来处理事件。
  • ApplicationEventPublisher:事件发布接口,Spring IoC 容器实现了该接口,开发者可以通过它发布事件。

自定义事件:

public class CustomEvent extends ApplicationEvent {public CustomEvent(Object source) {super(source);}
}

自定义监听器:

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {System.out.println("Received custom event: " + event.getSource());}
}

发布事件:

@Component
public class EventPublisher {@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;public void publishEvent() {CustomEvent customEvent = new CustomEvent(this);applicationEventPublisher.publishEvent(customEvent);}
}

在这个机制中,监听器通过实现 ApplicationListener 接口来处理特定的事件,发布器通过 ApplicationEventPublisher 接口发布事件,Spring IoC 容器负责监听器和事件的管理。

5. 资源访问

Spring Context 模块提供了统一的资源访问接口 Resource,可以用来访问各种形式的资源文件,如文件、URL、classpath 等。

获取资源:

Resource resource = applicationContext.getResource("classpath:data.txt");
InputStream inputStream = resource.getInputStream();

不同的资源前缀表示不同的资源类型:

  • classpath::类路径下的资源
  • file::文件系统中的资源
  • http::通过 HTTP 访问的资源
    在这里插入图片描述

6. 生命周期管理

Spring 提供了对 Bean 生命周期的全面管理,ApplicationContext 扩展了 BeanFactory 的功能,并提供了更加细粒度的生命周期控制。Bean 的生命周期包括初始化、依赖注入、初始化回调、销毁等阶段。

生命周期回调:

  • InitializingBeanDisposableBean 接口:这些接口允许在 Bean 初始化和销毁时执行自定义逻辑。
  • @PostConstruct@PreDestroy 注解:用于定义 Bean 初始化和销毁的回调方法。
  • init-methoddestroy-method:在 XML 或 Java 配置中定义 Bean 的初始化和销毁方法。

生命周期回调示例:

@Component
public class MyBean implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() {System.out.println("Bean 初始化");}@Overridepublic void destroy() {System.out.println("Bean 销毁");}
}

7. Environment 抽象

Spring Environment 抽象用于管理与应用程序运行环境相关的配置。它提供了配置文件、系统属性和环境变量等信息的统一访问方式。Environment 接口还支持对配置文件的处理,例如 devtestprod 环境的动态切换。

访问环境属性:

@Component
public class MyBean {@Autowiredprivate Environment env;public void printProperty() {String dbUrl = env.getProperty("database.url");System.out.println("Database URL: " + dbUrl);}
}

8. ApplicationContext 的扩展

Spring 提供了 ApplicationContext 的扩展,使其能够支持多种功能,如 Web 应用中的 WebApplicationContext,它是一个专用于 Web 环境的 ApplicationContext,与 Servlet 环境集成紧密,能够管理 Web 应用的生命周期、请求作用域 Bean、会话作用域 Bean 等。

WebApplicationContext 示例:

public class MyWebAppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(AppConfig.class);servletContext.addListener(new ContextLoaderListener(context));}
}

总结

Spring Context 模块扩展了基础的 Bean 管理功能,提供了更为全面的应用上下文管理。通过 ApplicationContext,开发者可以实现国际化、事件传播、资源访问、环境配置、生命周期管理等高级功能。这些特性为企业级应用程序开发提供了强大的支持,使应用程序更加灵活、可扩展和易于维护。

Spring Context 是 Spring 框架的中枢模块之一,它整合了大量企业级功能,并且可以通过注解、XML 和 Java 配置灵活定义和管理上下文,满足不同类型应用的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle+ASM+High冗余详解及空间计算

Oracle ASM&#xff08;Automatic Storage Management&#xff09;的High冗余模式是一种提供高度数据保护的策略&#xff0c;它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释&#xff1a; 一、High冗余的特点 1.数据冗余度 在Hi…

极速闪存启动:SD与SPI模式的智能初始化指南

最近很多客户朋友在询问我们 CS 创世 SD NAND 能不能使用 SPI 接口&#xff0c;两者使用起来有何区别&#xff0c;下面为大家详细解答。 SD MODE: CS 创世 SD NAND 支持 SD 模式和 SPI 模式&#xff0c;SD NAND 默认为 SD 模式&#xff0c;上电后&#xff0c;其初始化过程如下…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

深度学习基础—Batch Norm

对于一个神经网络我们知道&#xff0c;归一化输入特征是加速网络训练的技巧之一&#xff0c;因为归一化后&#xff0c;损失函数的图像就会由狭长变得更圆&#xff0c;那么这是否启发我们&#xff0c;在深度更深模型中&#xff0c;对各层的输出进行归一化&#xff0c;有益于下一…

day6 测试基础知识积累

JMeter 服务端系统性能测试是针对服务器端应用程序或服务 在特定负载下的运行能力和稳定性进行评估的方法。 产品文档应该有产品的性能指标&#xff0c;做性能测试前&#xff0c;如果需求文档没有性能指标则要向产品团队要。服务端系统性能测试 的常见指标有&#xff1a;TPS、…

ebpf教程(4.1):XDP程序的加载

文章目录 前言环境准备加载XDP程序源码构建过程运行 前言 前置阅读要求&#xff1a; ebpf教程(3):使用cmake构建ebpf项目-CSDN博客[译] [论文] XDP (eXpress Data Path)&#xff1a;在操作系统内核中实现快速、可编程包处理&#xff08;ACM&#xff0c;2018&#xff09;xdp-t…

kubeadm搭建生产环境高可用集群

前言 搞了好多天&#xff08;今天是20240819&#xff09;&#xff0c;中途遇到各种各样的问题&#xff0c;总算是可以用了 我这里用的vmware开了5台服务器做学习实践 K8S因为直接使用的 pkgs.k8s.io 仓库&#xff0c;所以直接拉取的最新release版&#xff08;v1.31&#xff09…

SIRA-PCR: Sim-to-Real Adaptation for 3D Point Cloud Registration 论文解读

目录 一、导言 二、 相关工作 1、三维点云配准工作 2、无监督域适应 三、SIRA-PCR 1、FlyingShape数据集 2、Sim-to-real自适应方法 3、配准 4、损失函数 一、导言 该论文来自于ICCV2023&#xff0c;论文提出了一种新的方法SIRA-PCR&#xff0c;通过利用合成数据Flying…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好&#xff0c;我是程序员鱼皮&#xff0c;8 月 19 日下午&#xff0c;网易云音乐突发严重故障&#xff0c;并登顶微博热搜&#xff0c;跟黑神话悟空抢了热度。 根据用户的反馈&#xff0c;故障的具体表现为&#xff1a;用户无法登录、歌单加载失败、播放信息获取失败、无法…

了解数据库中常用存储引擎数据结构(2)

目录 深入了解B树及其变种 BTree BTree B*Tree BTree并发机制 B-Link Tree 深入了解B树及其变种 先把我们要解释的B树变种都列出来&#xff0c;B树的变种主要有B树、B*树、B-Link树、COW B树、惰性B树、Bw树等。 下面具体来分析这些变种的优势和发展趋势。 BTree 下图…

Taro+Vue 创建微信小程序

TaroVue 创建微信小程序 一、全局安装 tarojs/cli二、项目初始化三、现在去启动项目吧 一、全局安装 tarojs/cli npm install -g tarojs/cli //安装 npm info tarojs/cli //查看安装信息 如果正常显示版本说明成功了&#xff0c;就直接跳到第二步吧官网说&#xff1a;…

AI产品经理如何入门?零基础入门到精通,收藏这一篇就够了

现在做产品经理&#xff0c;真的挺累的。 现在产品越来越难做&#xff0c;晋升困难&#xff0c;工资迟迟不涨……公司裁员&#xff0c;产品经理首当其冲&#xff01;&#xff01; 做产品几年了&#xff0c;还没升职&#xff0c;就先到了“职业天花板”。 想凭工作几年积累的…

BFS解决单源最短路问题

目录 迷宫中离入口最近的出口 最小基因变化 单词接龙 为高尔夫比赛砍树 迷宫中离入口最近的出口 题目 思路 使用宽度优先遍历解决这道题&#xff0c;需要一个二维数组标记是否被遍历过&#xff0c;也需要一个队列辅助完成宽度优先遍历&#xff0c;类似于水波纹一样&#x…

JAVA基础:File类

目录 前言 file对象的创建 file的常用方法 前言 file类表示的是系统中的一个文件或者文件夹 file类和系统中的文件或者文件夹不需要是一一对应的&#xff0c;我们可以在file类中写你系统中不存在的文件或文件夹 file类中存储的实际上是文件或文件夹的抽象路径&#xff0c…

面试经典算法150题系列-最长公共前缀

最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

软件测试 - 自动化测试(概念)(Java)(自动化测试分类、web自动化测试、驱动、selenium自动化测试工具的安装)

一、自动化的概念 ⾃动洒⽔机&#xff0c;主要通上⽔就可以⾃动化洒⽔并且可以⾃动的旋转。 ⾃动洗⼿液&#xff0c;免去了⼿动挤压可以⾃动感应出洗⼿液 超市⾃动闸⻔&#xff0c;不需要⼿动的开⻔关⻔ ⽣活中的⾃动化案例有效的减少了⼈⼒的消耗&#xff0c;同时也提⾼了⽣…

C语言程序设计(初识C语言后部分)

代码是一门艺术&#xff0c;键盘是我的画笔。 3.递归和迭代&#xff08;循环就是一种迭代&#xff0c;迭代不仅仅是循环&#xff09; 求n&#xff01; 递归方式&#xff1a; n!---> 1 (n1); n*(n-1)! (n>1) #include <stdio.h> //n!-->递归方式 int fac(in…

Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时&#xff0c;broker会向controller注册自己&#xff0c;并且从controller节点同步集群元数据。 broker是Kaf…

C++入门——16C++11新特性

1.列表初始化 初始化列表时&#xff0c;可添加等号()&#xff0c;也可不添加。 struct Point {int _x;int _y; };int main() {int x1 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C11中列表初始化也可以适用于new表达式中int* pa …

jstack结果提取特定线程池线程的堆栈

这里假设你已经知道如何定位java进程PID&#xff0c;以及如何执行jstack命令进行导出&#xff0c;下面仅提供相关命令&#xff0c;及示例 ps aux|grep java jstack 8229 > jstack_output.log v1版本 grep second jstack_output.log 如果此时我们想重点关注一下下面这个线程…