专题一: 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 {@Beanpublic 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 {@Overrideprotected 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 {@Transactionalpublic void performTransaction() {// 业务逻辑}
}

使用 Spring 的消息传递

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

Spring Integration 示例

@MessagingGateway
public interface MyGateway {@Gateway(requestChannel = "inputChannel")void sendToChannel(String data);
}@Configuration
public class IntegrationConfig {@Beanpublic IntegrationFlow integrationFlow() {return IntegrationFlows.from("inputChannel").handle(System.out::println).get();}
}

总结

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

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

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

相关文章

GitHub每日最火火火项目(6.30)

项目名称&#xff1a;modelscope / DiffSynth - Studio 项目介绍&#xff1a;该项目致力于让用户体验扩散模型的神奇魅力。扩散模型是一种具有广泛应用前景的技术&#xff0c;在图像生成、音频处理等领域展现出了强大的能力。通过DiffSynth - Studio&#xff0c;用户可以深入探…

Arrays.asList 和 java.util.ArrayList 区别

理解 Java 中的 Arrays.asList 和 java.util.ArrayList 的区别 在 Java 编程中&#xff0c;Arrays.asList 方法和 java.util.ArrayList 是两种常用的处理列表数据的方式。虽然它们在功能上看起来相似&#xff0c;但在内部实现和使用上有着本质的不同。本文将探讨这两种方式的区…

一区算法MPA|海洋捕食者算法原理及其代码实现(Matlab/Python))

Matlab/Python&#xff1a; 本文KAU将介绍一个2020年发表在1区期刊ESWA上的优化算法——海洋捕食者算法 (Marine Predators Algorithm&#xff0c;MPA)[1] 该算法由Faramarzi等于2020年提出&#xff0c;其灵感来源于海洋捕食者之间不同的觅食策略、最佳相遇概率策略、海洋记…

【Linux】IO多路复用——select,poll,epoll的概念和使用,三种模型的特点和优缺点,epoll的工作模式

文章目录 Linux多路复用1. select1.1 select的概念1.2 select的函数使用1.3 select的优缺点 2. poll2.1 poll的概念2.2 poll的函数使用2.3 poll的优缺点 3. epoll3.1 epoll的概念3.2 epoll的函数使用3.3 epoll的优点3.4 epoll工作模式 Linux多路复用 IO多路复用是一种操作系统的…

MCU复位时GPIO是什么状态?

大家一定遇到过上电或者复位时外部的MOS电路或者芯片使能信号意外开启&#xff0c;至此有经验的工程师就会经常关心一个问题&#xff0c;MCU复位时GPIO是什么状态&#xff1f;什么电路需要外部加上下拉&#xff1f; MCU从上电到启动&#xff0c;实际可分为复位前和复位后、初始…

【WPF】Windows系统桌面应用程序编程开发新手入门-打造自己的小工具

电脑Windows系统上的桌面程序通常是用Visual Studio 开发工具编写出来的&#xff0c;有两种开发方式供选择&#xff0c;一种是WindowForm&#xff0c;简称WinForm&#xff0c;另一种是Windows Presentation Foundation&#xff0c;简称WPF&#xff0c;这里将学习WPF项目。 文章…

大物3错题整理

平衡位置&#xff1a;在O点上的位置 相位&#xff1a; 当N很大的时候&#xff0c;wxwywz。因此&#xff0c;平均平动动能除以3&#xff0c;就是能量均分定理。 W F在x上的积分 Π时无单位 180&#xff0c;就是单位 1rad&#xff0c;rad就是单位 左手定则、右手定则、安培定…

C++模板类与继承

1&#xff09;模板类继承普通类&#xff08;常见&#xff09;。 2&#xff09;普通类继承模板类的实例化版本。 3&#xff09;普通类继承模板类。(常见) 4&#xff09;模板类继承模板类。 5&#xff09;模板类继承模板参数给出的基类&#xff08;不能是模板类&#xff09;。 示…

【抽代复习笔记】24-群(十八):循环群的两道例题

例1&#xff1a;证明&#xff1a; &#xff08;1&#xff09;三次交错群A3是循环群&#xff0c;它与(Z3,)同构&#xff0c;其中Z3 {[0],[1],[2]}&#xff1b; &#xff08;2&#xff09;G {1,i,-1,-i}&#xff0c;G上的代数运算是数的乘法&#xff0c;则G是一个循环群&…

如何解决三菱软件提示 起动MELSOFT Mediative Server失败

前言&#xff1a; 注意&#xff0c;这篇文章仅针对如何解决 起动MELSOFT Mediative Server失败 的问题。对于其他相关的问题&#xff0c;请搜索其他相应的解决办法。 本人是在重装三菱GX Works软件时遇到此问题的。后来搜索发现无人能妥善的关闭这个提示。因此本文介绍如何关…

【Web3项目案例】Ethers.js极简入门+实战案例:实现ERC20协议代币查询、交易

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 目录 简介 前景科普-ERC20 Ethers极简入门教程&#xff1a;HelloVitalik&#xff08;非小白可跳&#xff09; 教程概览 开发工具 V…

魔行观察-烤匠麻辣烤鱼-开关店监测-时间段:2011年1月 至 2024年6月

今日监测对象&#xff1a;烤匠麻辣烤鱼&#xff0c;监测时间段&#xff1a;2011年1月 至 2024年6月 本文用到数据源获取地址 魔行观察http://www.wmomo.com/ 品牌介绍&#xff1a; 2013年&#xff0c;第一家烤匠在成都蓝色加勒比广场开业&#xff0c;随后几年成都国金中心店…

超详细的tomcat安装以及简略项目的部署

一、安装包 安装路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1JzPQQ2zUdnXi_FaTTG0pvg?pwdriht 提取码&#xff1a;riht 安装完之后我们打开&#xff0c;可看见以下目录结构 二、环境变量配置 首先打开我们电脑的高级环境变量配置 我们先配置一个系统变量…

Variables Reference for vscode

Predefined variables Visual Studio Code 支持在调试、任务配置文件以及一些特定的设置中使用变量替换。这些变量可以使用 ${variableName} 语法在 launch.json 和 tasks.json 文件的某些键和值字符串中使用。 Predefined variables Visual Studio Code 支持以下预定义变量…

Zookeeper:Zookeeper JavaAPI操作与分布式锁

文章目录 一、Zookeeper JavaAPI操作1、Curator介绍2、创建、查询、修改、删除节点3、Watch事件监听 二、Zookeeper分布式锁原理 一、Zookeeper JavaAPI操作 1、Curator介绍 Curator是Apache Zookeeper的Java客户端。常见的Zookeeper Java API&#xff1a; 原生Java API。ZkC…

天气网站爬虫及可视化

摘要&#xff1a;随着互联网的快速发展&#xff0c;人们对天气信息的需求也越来越高。本论文基于Python语言&#xff0c;设计并实现了一个天气网站爬虫及可视化系统。该系统通过网络爬虫技术从多个天气网站上获取实时的天气数据&#xff0c;并将数据进行清洗和存储。同时&#…

数据仓库面试题(二)

1. 简述星型模型和雪花模型的区别&#xff1f;应用场景 &#xff1f; 星型模型&#xff08;Star Schema&#xff09;和雪花模型&#xff08;Snowflake Schema&#xff09;是数据仓库中常用的两种维度建模方法&#xff0c;它们在数据组织和设计上有所不同。 星型模型&#xff…

【简易版tinySTL】 哈希表与移动语义

基本概念 哈希表&#xff08;HashTable&#xff09;是一个重要的底层数据结构, 无序关联容器包括unordered_set, unordered_map内部都是基于哈希表实现。 哈希表是一种通过哈希函数将键映射到索引的数据结构&#xff0c;存储在内存空间中。哈希函数负责将任意大小的输入映射到…

【C++】内存分区

目录 内存分区代码运行前后区别各分区详细解释C内存申请和释放 内存分区 不同的操作系统对程序内存的管理和划分会有所不同。 此处是C内存区域划分主要是针对通用的情况&#xff0c;并不限定在某个特定操作系统上 一般分为4个区&#xff08;有时把全局区拆分成数据区未初始化…

git 命令学习之branch 和 tag 操作

引言 在项目一个迭代过程结束之时&#xff0c;或是一个版本发布之后&#xff0c;我们要进行 新版本的开发&#xff0c;这时就需要对原来的项目代码进行封存&#xff0c;以及新项目代码的开始&#xff0c;这时就需要用到 branch 和 tag 操作。下面简单说说对这两个操作的理解。…