专题一: Spring生态初探

咱们先从整体脉络上看下Spring有哪些模块,重要的概念有个直观印象。 从Spring框架的整体架构和组成对整体框架有个认知。

 Spring框架基础概念

 Spring基础 - Spring和Spring框架组成
上图是从官网4.2.x获取的原图,目前我们使用最广法的版本应该都是5.x,5版本移除了Web模块中的Portlet子模块,新增了WebFlux模块,同时新增了公共的JCl日志管理模块。
我们JVM专题模块,通过一张图大概了解Java是如何运行的,如何通过将我们编写的Java代码编译成JVM可以认识的字节码的如何实现跨平台运行的。
同样Spring咱们也来瞅瞅Spring是将我们编写的Xml、注解或者其他配置文件编程Spring可以管理的Bean的?

在正式进入Spring专题之前,咱们先熟悉一下相关概念
Spring框架是一个开源的Java平台,它提供了全面的基础设施支持,以便您可以更容易地开发Java应用程序。Spring处理了基础设施,这样您就可以专注于您的应用程序。以下是对Spring框架整体架构和组成的概述:

控制反转(IoC)和依赖注入(DI)

Spring 框架的核心是其控制反转(IoC)容器,该容器管理应用程序对象(称为 bean)的创建、配置和生命周期。依赖注入(DI)是一种实现 IoC 的设计模式,容器在运行时注入对象的依赖关系,减少组件之间的耦合,增强模块化。

Bean 配置

Spring 中的 Bean 可以使用 XML、注解或基于 Java 的配置进行配置。

下面是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"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="jmUser" class="org.springframework.dto.JmUser">
		<property name="name" value="测试一" />
		<property name="age" value="18" />
	</bean>

</beans>

以下是使用注解的示例: 

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

面向切面编程(AOP)

Spring 的 AOP 框架允许模块化处理日志记录、安全性和事务管理等关注点。切面使得横切关注点与主要业务逻辑分离。

定义切面

切面可以使用注解或 XML 定义。以下是使用注解的示例:


@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Method Called: " + joinPoint.getSignature().getName());
    }
}

Spring 模块

Spring MVC

Spring MVC 是一个用于构建 Web 应用程序的框架。它遵循模型-视图-控制器(MVC)设计模式,促进关注点的清晰分离。

控制器

Spring MVC 中的控制器负责处理用户请求并返回适当的响应。


@Controller
public class HomeController {
    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "Welcome to Spring MVC");
        return "home";
    }
}
视图

Spring MVC 中的视图可以使用 JSP、Thymeleaf 或 FreeMarker 等技术实现。以下是使用 Thymeleaf 的示例:


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Home</title>
</head>
<body>
    <h1 th:text="${message}">Welcome</h1>
</body>
</html>

Spring Data

Spring Data 简化了数据访问,提供了一致的编程模型来访问不同的数据存储。它包括用于关系数据库(Spring Data JPA)、NoSQL 数据库(Spring Data MongoDB)等的模块。

Spring Data 仓库抽象了数据访问层,减少了样板代码。以下是一个 JPA 仓库的示例:


public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByLastName(String lastName);
}

Spring Security

Spring Security 是一个功能强大且可定制的认证和访问控制框架。它为 Java 应用程序提供全面的安全服务。

安全配置

Spring 中的安全配置可以使用基于 Java 的配置进行定义:


@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/**").permitAll()
        .and()
        .formLogin();
    }
}

Spring Boot

Spring Boot 通过提供约定优于配置和嵌入式服务器来简化 Spring 应用程序的开发。

创建 Spring Boot 应用程序

一个典型的 Spring Boot 应用程序可以用最少的配置创建:


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

Spring Cloud

Spring Cloud 提供构建分布式系统的工具,包括服务发现、断路器和配置管理。

Spring Cloud 通过其工具套件促进微服务的开发。以下是使用 Eureka 的服务注册示例:


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

1. 客户端

  • IoT、Mobile、Browser:这些是访问微服务系统的不同客户端设备。它们通过 API Gateway 来访问系统中的微服务。

2. API Gateway

  • API Gateway:API 网关是客户端与微服务之间的唯一入口。它负责请求路由、安全认证、负载均衡、监控和流量管理等功能。通过 API 网关,客户端可以统一地访问不同的微服务,而不需要直接与每个微服务进行交互。

3. 微服务

  • Microservices:微服务是系统的核心业务逻辑,每个微服务都是一个独立的功能模块,负责特定的业务功能。微服务之间通过轻量级的通信协议(如 HTTP 或消息队列)进行交互。

4. 服务注册与发现

  • Service Registry:服务注册中心用于管理微服务的注册和发现。每个微服务启动时,会将自己的地址和端口注册到服务注册中心。其他微服务通过查询服务注册中心来找到需要调用的微服务地址。常用的服务注册中心有 Eureka、Consul、Zookeeper 等。

5. 配置管理

  • Config Server:配置服务器用于集中管理微服务的配置文件。微服务启动时会从配置服务器获取配置,这样可以确保所有微服务使用一致的配置,并且可以在不重启微服务的情况下动态更新配置。

6. 分布式跟踪

  • Distributed Tracing:分布式追踪系统用于监控和分析微服务之间的调用链路,帮助开发和运维人员追踪请求的流转路径,识别性能瓶颈和故障点。常用的分布式追踪系统有 Zipkin、Jaeger 等。

小结

这张图展示了一个典型的基于 Spring Cloud 的微服务架构,包括了 API 网关、服务注册中心、配置服务器、分布式追踪和微服务模块。客户端通过 API 网关与系统交互,API 网关负责请求路由和安全管理;微服务通过服务注册中心实现动态的服务发现和调用;配置服务器集中管理微服务的配置;分布式追踪系统帮助监控和分析微服务的调用链路。

这种架构设计使得系统具有良好的扩展性和灵活性,能够支持大规模的分布式应用,并且易于管理和维护。

高级主题

事务管理

Spring 的事务管理框架抽象了事务管理的复杂性,允许声明式事务管理。


@Service
public class TransactionalService {
    @Transactional
    public void performTransaction() {
        // 业务逻辑
    }
}

使用 Spring 的消息传递

Spring Integration 和 Spring AMQP 提供了对消息传递的支持,使得开发消息驱动的应用程序成为可能。

Spring Integration 示例

@MessagingGateway
public interface MyGateway {
    @Gateway(requestChannel = "inputChannel")
    void sendToChannel(String data);
}

@Configuration
public class IntegrationConfig {
    @Bean
    public IntegrationFlow integrationFlow() {
        return IntegrationFlows.from("inputChannel")
                .handle(System.out::println)
                .get();
    }
}

总结

Spring 框架是企业级 Java 开发的一个多功能且全面的框架。通过理解其核心概念和模块,开发人员可以利用其强大的功能构建健壮、可扩展且易维护的应用程序。

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

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

相关文章

svn怎么新建分支,切换分支

在当前分支下&#xff0c;点svn右键&#xff0c;选择分支/标记 在选择远端地址时&#xff0c;点右边更多选项&#xff0c;打开远端版本库。找到对应的分支上级位置&#xff0c;点击确定 填写新分支名称&#xff0c;我这儿是将分支建在了branches下&#xff0c;分支名称为V1.1 填…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构&#xff1a; 如何通过包查找到文件&#xff0c;通过URL对应源码的文件&#xff0c;或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术&#xff0c;pyth…

二级建造师(建筑工程专业)考试题库,高效备考!!!

16.在施工合同履行期间发生的变更事项中&#xff0c;属于工程变更的是&#xff08;&#xff09;。 A.质量要求变更 B.分包单位变更 C.合同价款变更 D.相关法规变更 答案&#xff1a;A 解析&#xff1a;工程变更一般是指在工程施工过程中&#xff0c;根据合同约定对施工的…

SSM学习2:依赖注入、依赖自动装配、集合注入、加载properties文件

依赖注入 依赖注入方式 setter注入——引用类型 setter注入——简单类型 public class BookDaoImpl implements BookDao {public void setDatabaseName(String databaseName) {this.databaseName databaseName;}public void setNum(int num) {this.num num;}private Stri…

Spark学习3.0

目录 10.3.4 Spark运行原理 1.设计背景 2.RDD概念 3.RDD特性 4.RDD之间的依赖关系 窄依赖和宽依赖 5.Stage的划分 Stage的类型包括两种&#xff1a;ShuffleMapStage和ResultStage 6.RDD运行过程 10.3.4 Spark运行原理 1.设计背景 许多 迭代式算法&#xff08;比如机器学习、图…

【C++】————string基础用法及部分函数底层实现

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月30日 前言&#xff1a; 本文主要介绍STL容器之一 ---- string&#xff0c;在学习C的过程中&#xff0c;我们要将C视为一个语言联邦&#xff08;摘录于Effective C 条款一&#x…

读书笔记-《Spring技术内幕》(三)MVC与Web环境

前面我们学习了 Spring 最核心的 IoC 与 AOP 模块&#xff08;读书笔记-《Spring技术内幕》&#xff08;一&#xff09;IoC容器的实现、读书笔记-《Spring技术内幕》&#xff08;二&#xff09;AOP的实现&#xff09;&#xff0c;接下来继续学习 MVC&#xff0c;其同样也是经典…

朋友问我Java中“::”是什么意思?我汗流浃背了......

目录 一&#xff1a;什么是&#xff1a;&#xff1a;&#xff1f; 二&#xff1a;方法引用的几种类型 1.引用静态方法 2.引用特定对象的实例方法 3.引用特定类型的任意对象的实例方法 4.引用构造方法 三&#xff1a;方法引用的适用场景 四&#xff1a;总结 一&#xff1…

数学建模比赛介绍与写作建议

0 小序 本文的写作起因是导师要求我给打算参加相关竞赛的师弟们做一次讲座和汇报。我梳理了一个ppt提纲&#xff0c;并经过整理&#xff0c;因此有了这篇文章。 我打算从数学建模论文写作格式和写作技巧入手&#xff0c;接着介绍数学建模常用的数学模型&#xff0c;最后提出一…

sheng的学习笔记-AI-聚类(Clustering)

ai目录 sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是聚类 在“无监督学习”(unsupervised learning)中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础。此类学…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

清华大学世界排名:2025QS世界大学排名第20名

近日&#xff0c;国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名&#xff0c;其中麻省理工学院连续第13年蝉联榜首&#xff0c;北京大学排名由去年的全球第17上升至全球第14名&#xff0c;清华大学位列2025QS世界大学排名第20名&#xff0c;以下是查…

Linux——/etc/passwd文件含义,grep,cut

/etc/passwd文件含义 作用 - 记录用户账户信息&#xff1a;共分为7段&#xff0c;使用冒号分割 含义 - 文件内容意义&#xff1a;账户名&#xff1a;密码代号x&#xff1a;UID&#xff1a;GID&#xff1a;注释&#xff1a;家目录&#xff1a;SHELL - 第7列/sbin/nologin&#x…

大数据可视化实验(七):Python数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;绘制带颜色的柱状图。.. 1 2&#xff09;绘制堆叠柱状图。.. 3 3&#xff09;绘制数学函数曲线图。.. 4 4&#xff09;使用seaborn绘制组合图形。... 5 5&#xff09;使用Boken绘制多个三角形…

软件框架(Framework)是什么?

可实例化的、部分完成的软件系统或子系统&#xff0c;它为一组系统或子系统定义了统一的体系结构(architecture)&#xff0c;并提供了构造系统的基本构造块(building blocks)&#xff0c;还为实现具体功能定义了扩展点(extending points)。 框架实现了体系结构级别的复用。 其…

深度学习评价指标:Precision, Recall, F1-score, mIOU, 和 mDice

在深度学习和机器学习中&#xff0c;评价模型性能是至关重要的一环。本文将详细讲解一些常见的评价指标&#xff0c;包括精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1-score、平均交并比&#xff08;mIOU&#xff09;和平均Dice系数&am…

[leetcode]beautiful-arrangement. 优美的排列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> match;vector<int> vis;int num;void backtrack(int index, int n) {if (index n 1) {num;return;}for (auto &x : match[index]) {if (!vis[x]) {vis[x] tru…

【C++】宏定义

严格来说&#xff0c;这个题目起名为C是不合适的&#xff0c;因为宏定义是C语言的遗留特性。CleanCode并不推荐C中使用宏定义。我当时还在公司做过宏定义为什么应该被取代的报告。但是适当使用宏定义对代码是有好处的。坏处也有一些。 无参宏定义 最常见的一种宏定义&#xf…

Python 面试【中级】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【游戏引擎之路】登神长阶(五)

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-6月30日&#xff1a;攻克《Windows游戏编程大师技巧》。 …