【Spring】Spring的模块架构与生态圈—核心容器(Beans、Core、Context、Expression)

Spring框架因其强大的功能和灵活性而成为企业级应用开发的首选,它的模块化设计使得开发者可以根据需求选择合适的模块,降低了系统的复杂性。核心容器模块是Spring框架的基础,它为整个框架提供了核心功能,包括Bean的管理、上下文的支持和表达式语言的解析等。

在本文中,我们将深入探讨Spring的核心容器模块,包括以下几个子模块:

  1. Beans

  2. Core

  3. Context

  4. Expression

通过详细的理论介绍和具体的代码示例,帮助你全面理解Spring核心容器的架构和功能。

1. 核心容器的重要性

核心容器模块是Spring框架的基础,负责管理应用程序中的对象(通常称为Beans)。它提供了依赖注入(DI)和控制反转(IoC)的功能,使得开发者可以轻松管理对象的生命周期和依赖关系。在实际应用中,核心容器的使用能够有效降低代码的耦合度,提高系统的可维护性和可测试性。

比如,在厨房中,厨师需要各种食材(Beans)来准备菜肴,而厨房的管理系统(Core)负责调配和管理这些食材。厨师可以根据需要随时获取食材,而不必关心食材的来源和存储方式。这样,厨师可以专注于烹饪,而厨房管理系统则确保一切运转顺利。

2. 核心容器模块的子模块
2.1 Beans模块

Beans模块是Spring的核心部分,负责Bean的定义、创建、配置和管理。它使用IoC容器来管理对象的生命周期和依赖关系。

主要功能

  • Bean的定义和配置

  • 依赖注入(DI)

  • 生命周期管理

示例

<!-- beans.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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myService" class="com.example.MyService">
        <property name="myRepository" ref="myRepository"/>
    </bean>

    <bean id="myRepository" class="com.example.MyRepository"/>
</beans>

解释

  • 在这个XML配置文件中,我们定义了两个Bean:myServicemyRepositorymyService依赖于myRepository,通过<property>标签进行依赖注入。Spring会在创建myService时自动注入myRepository的实例。

2.2 Core模块

Core模块是Spring的基础,提供了IoC和DI的核心功能。它是构建其他模块的基础,负责管理Bean的创建和依赖关系。

主要功能

  • IoC容器

  • Bean工厂(BeanFactory)

  • 应用程序上下文(ApplicationContext)

示例

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        // 获取myService Bean
        MyService myService = (MyService) context.getBean("myService");
        myService.performAction();
    }
}

解释

  • 在这个示例中,我们使用ClassPathXmlApplicationContext加载Spring配置文件beans.xml,并从中获取myService Bean。Spring会自动处理依赖注入,确保myService中的myRepository已经被正确注入。

2.3 Context模块

Context模块是Spring的高级模块,提供了更丰富的功能,包括国际化、事件传播和应用程序上下文的支持。它在Core模块的基础上扩展了更多功能,使得开发者能够更方便地使用Spring。

主要功能

  • 应用程序上下文(ApplicationContext)

  • 事件发布和监听

  • 国际化支持

示例

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        // 事件发布示例
        MyEventPublisher publisher = context.getBean(MyEventPublisher.class);
        publisher.publish("Hello, Spring Context!");
    }
}
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;

@Component
public class MyEventPublisher implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publish(String message) {
        MyEvent event = new MyEvent(this, message);
        publisher.publishEvent(event);
    }
}

解释

  • 在这个示例中,我们定义了一个事件发布者MyEventPublisher,它实现了ApplicationEventPublisherAware接口,以便获取ApplicationEventPublisher的实例。我们可以通过publish方法发布自定义事件MyEvent。Spring会自动处理事件的传播和监听。

2.4 Expression模块

Expression模块提供了对Spring表达式语言(SpEL)的支持,允许开发者在Spring配置中使用表达式进行动态计算。SpEL可以用于属性值、方法调用和条件判断等场景。

主要功能

  • 动态计算属性值

  • 方法调用

  • 访问和操作对象图

示例

<bean id="myService" class="com.example.MyService">
    <property name="name" value="#{systemProperties['user.name']}"/>
</bean>

解释

  • 在这个示例中,我们使用SpEL动态获取系统属性user.name并将其赋值给myServicename属性。这种动态计算的能力使得Spring配置更加灵活。

3. 总结

Spring的核心容器模块为开发者提供了强大的Bean管理和依赖注入功能,使得Java应用程序的开发更加高效和灵活。通过理解核心容器的各个子模块(Beans、Core、Context和Expression),开发者可以更好地利用Spring框架构建高质量的企业级应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台

本篇将带你实现一个虚拟音乐控制台。用户可以通过界面控制音乐的播放、暂停、切换歌曲&#xff0c;并查看当前播放的歌曲信息。页面还支持调整音量和动态显示播放进度&#xff0c;是音乐播放器界面开发的基础功能示例。 关键词 UI互动应用音乐控制播放控制动态展示状态管理按钮…

用QT制作的倒计时软件

一、pro代码 RC_ICONS countdown.ico 二、mainwindow.cpp代码 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QDateTime> #include <QMessageBox> #include <QSettings>MainWindow::MainWindow(QWidget *parent): QM…

Unbuntu下怎么生成SSL自签证书?

环境&#xff1a; WSL2 Unbuntu 22.04 问题描述&#xff1a; Unbuntu下怎么生成SSL自签证书&#xff1f; 解决方案&#xff1a; 生成自签名SSL证书可以使用OpenSSL工具&#xff0c;这是一个广泛使用的命令行工具&#xff0c;用于创建和管理SSL/TLS证书。以下是生成自签名…

springboot446数字化农家乐管理平台的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

laya游戏引擎中打包之后图片模糊

如下图正常运行没问题&#xff0c;打包之后却模糊 纹理类型中的默认类型都是精灵纹理&#xff0c;改为默认值即可。注意&#xff1a;要点击“应用”才可有效。精灵纹理类型会对图片进行渲染处理&#xff0c;而默认值 平面类型不会处理图片。

[SZ901]FPGA程序固化工具使用方法

工具为脚本形式&#xff0c;前期需进行vivado版本&#xff0c;下载器端口配置 1&#xff0c;编辑 【SZ901程序固化工具.bat】&#xff0c;设置软件版本 修改软件版本和安装路径 2&#xff0c;设置下载器端口&#xff08;SZ901->USER_TCL->FlashBurn_Config.tcl&#x…

基于微信小程序的小区疫情防控ssm+论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需…

Arduino ADC模数转换

1.Arduino UNO ADC的配置及原理 1.1ADC配置 1.1.1分辨率 Arduino Uno支持6个adc模数转换,其ADC只有10位分辨率,也就是说我们只能将输入电平分成2^101024份(0~1023),4.88mV的测量精度. 1.1.2输入电压范围 Arduino Uno的引脚输出是5V,同样引脚输入也最多支持5V,我们可以5V电压分…

论文笔记:是什么让多模态学习变得困难?

整理了What Makes Training Multi-modal Classification Networks Hard? 论文的阅读笔记 背景方法OGR基于最小化OGR的多监督信号混合在实践中的应用 实验 背景 直观上&#xff0c;多模态网络接收更多的信息&#xff0c;因此它应该匹配或优于其单峰网络。然而&#xff0c;最好的…

唯品会Android面试题及参考答案

HTTP 和 HTTPS 的区别是什么&#xff1f;你的项目使用的是 HTTP 还是 HTTPS&#xff1f; HTTP 和 HTTPS 主要有以下区别。 首先是安全性。HTTP 是超文本传输协议&#xff0c;数据传输是明文的&#xff0c;这意味着在数据传输过程中&#xff0c;信息很容易被窃取或者篡改。比如&…

LWIP协议:三次握手和四次挥手、TCP/IP模型

一、三次握手&#xff1a;是客户端与服务器建立连接的方式&#xff1b; 1、客户端发送建立TCP连接的请求。seq序列号是由发送端随机生成的&#xff0c;SYN字段置为1表示需要建立TCP连接。&#xff08;SYN1&#xff0c;seqx&#xff0c;x为随机生成数值&#xff09;&#xff1b;…

Kafka Streams 在监控场景的应用与实践

作者&#xff1a;来自 vivo 互联网服务器团队- Pang Haiyun 介绍 Kafka Streams 的原理架构&#xff0c;常见配置以及在监控场景的应用。 一、背景 在当今大数据时代&#xff0c;实时数据处理变得越来越重要&#xff0c;而监控数据的实时性和可靠性是监控能力建设最重要的一环…

Medium是什么,Medium能干嘛,如何用开通medium会员

1.背景介绍 1.1 什么是medium medium是国外一个内容创作和分享平台。 主要用户来自美国&#xff0c;每月有26万的访问量。 网址&#xff1a; Medium官网 平台注重优质、专业的内容。 这个平台有2点比较吸引人&#xff1a; ① 内容优质、专业 ② 在上面写作&#xff0c;能…

【实验17】不同优化算法的比较分析

目录 1 不同优化算法比较分析-2D可视化实验 1.1 优化算法的实验设定(以函数为例) 1.2 学习率调整优化策略 1.1.2 AdaGrad算法 1.1.2 RMSprop算法 1.3 梯度估计修正优化策略 1.3.1 动量法 1.3.2 Adam算法 1.4 完整代码 1.5 函数 的优化算法比较 2 不同优化算法比较分…

复习打卡大数据篇——Hadoop HDFS 01

目录 1. HDFS简介 2. HDFS基本操作 3. HDFS原理 1. HDFS简介 HDFS概念&#xff1a; HDFS是一个分布式的文件系统。分布式意味着多台机器存储&#xff0c;文件系统&#xff0c;就是用来存储文件、存储数据。是大数据最底层一个服务。 HDFS设计目标&#xff1a; 故障的检测…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

基于base32的兑换码算法(思路)

base32编码指的是基于32个可打印字符对任意字节数据进行编码&#xff1a;大写字母A-Z以及数字2-7。 兑换码要求:长度为10个字符 如果将这32个字符依次放到一个base数组中&#xff0c;那么最大的下标就是31。我们将要编码的任意字节数据按照五个bit为一组进行划分&#xff0c;…

前端开发环境(vue)

1. 安装nvm管理nodejs的版本 1. 配置nvm 2. 用npm安装nodejs,选则nodejs版本,这是js的运行环境 3 . 安装npm,这是前端的包管理器 npm是nodejs开发的包管理器,现在下载了nodejs就默认下载npm了,绑在一块了,不用 1. npm的中央仓库 2. npm私服仓库 换库 npm config set r…

第十七章:反射+设计模式

一、反射 1. 反射(Reflection)&#xff1a;允许在程序运行状态中&#xff0c;可以获取任意类中的属性和方法&#xff0c;并且可以操作任意对象内部的属 性和方法&#xff0c;这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。 2. 类对象 和 类的对象(实…

arduino继电器与电机水泵的使用

首先说一句&#xff0c;真受不了网上的教程&#xff0c;大海里捞金&#xff0c;要不上来了就讲原理&#xff0c;怎么具体使用一句不说&#xff0c;要么炫技来了。 继电器&#xff0c;简单来说把他当开关看&#xff0c;通过小电流控制大电流(原理去看其他视频)&#xff0c;要记…