网站区域名怎么注册,网站群建设 中标,微信小程序怎么做表格,专业网站建设模板1. 概述
1.1. Spring是什么
Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架#xff0c;由 Rod Johnson 创立#xff0c;旨在显著降低 Java 企业应用的复杂性#xff0c;缩短开发周期#xff0c;并提升开发效率。Spring 不仅适用于服务器端开发#x… 1. 概述
1.1. Spring是什么
Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架由 Rod Johnson 创立旨在显著降低 Java 企业应用的复杂性缩短开发周期并提升开发效率。Spring 不仅适用于服务器端开发也因其简单的设计、卓越的可测试性和倡导的松耦合原则使得几乎所有类型的 Java 应用都能从中获得好处。
Spring 框架的核心价值在于提供了诸如控制反转IoC、面向切面编程AOP等机制增强了代码的可维护性和可扩展性并且集成了众多第三方库和框架如数据库访问、事务管理、MVC、RESTful API 构建、安全控制等从而形成了一个全方位的企业级应用开发解决方案。
随着版本的不断迭代升级Spring 已发展到第 6 个主要版本——Spring 6.1.4这个版本代表了 Spring 团队在响应式编程、模块化支持、性能优化、以及与现代 Java 和云原生环境兼容等方面的最新成果。 须知现在是更新到了6.1.4该笔记是基于尚硅谷的6.0.2 1.2. Spring 的狭义和广义
在不同的语境中Spring 所代表的含义是不同的。
广义的 SpringSpring 技术生态体系 在广义上Spring 指的是围绕 Spring Framework 扩展建立的一个庞大的技术生态系统其中包括多个紧密关联的子项目或模块。这个技术栈致力于满足不同层次的开发需求例如 Web 开发Spring MVC、快速应用搭建Spring Boot、分布式服务治理Spring Cloud、数据访问抽象Spring Data、安全控制Spring Security等等。每一个子项目都基于 Spring Framework 的核心能力进行构建为开发者提供了从基础架构到高级应用场景的一整套解决方案。
狭义的 SpringSpring Framework 狭义上的 Spring 即 Spring Framework这是整个 Spring 生态系统的核心部分通常我们称之为 Spring 框架。它是一种轻量级的 Java 应用开发框架通过提供 IoC控制反转和 AOP面向切面编程两大核心技术简化了企业级应用的复杂性提升了开发效率。
IoC (Inver of Control 控制反转)这是一种设计思想意味着对象的创建不再由程序本身直接控制转而交由 Spring 容器统一管理和负责创建、注入。这样可以降低代码之间的耦合度提高组件重用性和可测试性。AOP (Aspect of Control 面向切面编程)AOP 主要是针对横切关注点进行处理的技术它可以将分散在各个业务模块中的通用功能如日志记录、事务管理、权限验证等抽取出来形成“切面”然后织入到目标组件执行的过程中。这种机制极大地减少了代码重复提高了系统的可维护性和灵活性同时降低了模块间的耦合度。 总结简单解释就是
广义的 Spring可以理解为一个完整的 Java 技术生态系统包括一系列由 Spring 团队开发和维护的子项目这些项目各具特色互相配合共同服务于企业级应用的开发全过程从基础的依赖注入、面向切面编程到 Web 开发、微服务架构、数据访问、安全性控制等方面均有覆盖极大地方便了开发者构建高质量、高效率的软件系统。
狭义的 Spring则特指 Spring Framework 这一具体框架它是整个 Spring 生态系统的基石。Spring Framework 通过实现控制反转IoC来解耦组件之间的依赖关系让代码更加灵活易管理同时它引入了面向切面编程AOP机制使得开发者能方便地在系统中定义和应用横切关注点如日志、事务管理等进而增强代码复用性和系统可维护性。 1.3. Spring Framework特点
Spring Framework 的五大特点
非侵入式设计
Spring 在不影响应用程序原有结构的前提下提供强大的功能支持。它允许开发者保持领域模型的纯净仅需在功能性组件上添加少量注解即可无缝集成 Spring 功能使整体架构更为整洁、精炼。Spring Framework 设计得非常巧妙就像一位隐形助手。在你使用它的功能时不需要大幅改动你的原有代码结构或者模型。比如你只需在需要的地方轻轻添加几个注解像是贴标签一样Spring 就能识别并帮你完成复杂的依赖管理而不改变你的核心业务逻辑代码让代码更清爽易于理解和维护。 控制反转 (IoC)
Spring 引入了 IoC 原则即控制权由应用程序转移到容器实现了资源的自动装配和管理。开发人员无需手动创建和管理对象而是由 Spring 容器负责创建和组装对象通过依赖注入的方式供应用程序使用。IoC 就像一个贴心的管家。在没有 Spring 之前你需要自己动手创建对象、找对象并管理它们的关系。有了 IoC 后你就不用亲自操心这些事情了。你只需要告诉 Spring 容器你想要什么Spring 会主动为你准备妥当然后送到你面前即所谓的资源注入。这样一来你的代码变得更专注于业务逻辑而非对象的创建和管理。 面向切面编程 (AOP)
Spring 支持 AOP允许开发者在不修改原始代码的情况下通过声明式的方式对程序进行功能增强。这种方式有助于提高代码的复用性和模块间的解耦。AOP 就像是给代码加了一个神奇的调料包。在不修改主菜业务代码的前提下你可以通过 AOP 添加一些通用的功能比如“调味品”如日志、权限检查、事务管理等。这些“调料”会在合适的时间自动加入到“主菜”中让你的代码具备更多功能的同时保持主体部分干净简洁避免了重复代码和过度耦合。 容器化管理
Spring IoC 容器扮演着组件工厂的角色全面管理组件对象的生命周期。容器提供的自动化管理大大减轻了开发者的负担简化了对象的创建和管理过程显著提高了开发效率。Spring IoC 容器就如同一个全能的智能工场它负责孕育和管理所有对象组件的生命周期。当你注册组件到容器后容器会帮你实例化对象、管理对象间依赖关系甚至还能自动回收无用的对象。这种容器化管理大大降低了编程的复杂度让开发者更专注于业务逻辑的实现而不是琐碎的底层对象管理工作。 组件化与一站式整合
Spring 支持组件化开发通过 XML 或 Java 注解等方式灵活组装对象便于构建复杂的大型应用系统。此外Spring 凭借其 IoC 和 AOP 的核心能力可以很好地集成各类开源框架和第三方类库实现一站式开发满足企业级应用的多元化需求。Spring 旗下的诸多项目已覆盖云计算、微服务、数据访问等多个层面成为构建完整 Java 应用生态的理想选择。Spring 提倡组件化开发就好比搭积木一样每个积木块都是一个独立且功能明确的小组件。通过简单的配置XML 或 Java 注解你可以把这些组件拼接在一起构建出庞大而复杂的应用系统。同时Spring 拥有一站式的整合能力可以轻松融入多种开源框架和第三方库从而为开发者打造了一站式的开发环境让开发 Java 应用变得更加高效便捷。 1.4. Spring模块组成
官网地址Spring | Home 上图中包含了 Spring 框架的所有模块这些模块可以满足一切企业级应用开发的需求在开发过程中可以根据需求有选择性地使用所需要的模块。下面分别对这些模块的作用进行简单介绍。 Spring Core核心容器 spring-core提供Spring框架的基础功能包括控制反转IoC和依赖注入DI的基本实现使得开发者无需手动管理对象的创建和依赖关系。spring-beans定义了BeanFactory接口和相关的类用于管理和装配Java Bean对象这是Spring IoC容器的基础组件。spring-context扩展了BeanFactory提供了ApplicationContext上下文它是完整功能的IoC容器还包含国际化、资源加载、事件传播等功能。spring-expressionSpELSpring表达式语言提供了在运行时查询和操作对象图的强大的表达式语言。 Spring AOP面向切面编程 spring-aop实现面向切面编程的基础模块支持代理机制如JDK动态代理、CGLIB字节码生成等方式。spring-aspects集成了AspectJ增强了Spring框架的AOP能力允许在程序中无缝插入横切关注点。spring-instrument提供了类加载器级别的代理工具类主要用于监控和处理类加载过程以便于进行AOP代理和其他类型的类增强。 Spring Data Access spring-jdbc简化了JDBC的操作提供了一套方便的API进行数据库访问。spring-orm提供了与主流ORM框架如Hibernate、MyBatis等的集成支持。spring-oxm提供对象与XML之间的映射支持方便数据的序列化和反序列化。spring-jms对Java消息服务JMS的抽象封装便于在分布式系统中实现消息传递。spring-tx实现了声明式事务管理可以方便地在业务逻辑层进行事务控制。 Spring Web spring-web提供了基本的Web应用支持构建在Spring Context之上可以通过Servlet或者监听器初始化IoC容器。spring-webmvc基于模型-视图-控制器MVC架构模式的实现简化了Web应用程序的开发。spring-websocket提供WebSocket的支持实现服务器与客户端的全双工实时通信。spring-webfluxSpring 5.0后新增的非阻塞式Reactive Web框架适用于异步、非阻塞、事件驱动的Web应用开发。 Spring Messaging spring-messaging为Spring框架增加了对消息传递Messaging的支持比如处理HTTP请求、WebSocket消息等。 Spring Test spring-test提供了对JUnit和其他测试框架的集成支持简化了对Spring应用进行集成测试的过程。 2. 入门案例开发
2.1. 环境要求
JDKJava17Spring6要求JDK最低版本是Java17Maven3.6Spring6.0.2
注我自己笔记上面演示的IDEA版本是2023.3.3也是我现在用的版本 2.2. 构建模块
构建父模块spring6 这里Spring6是父工程它的src文件可有可无其中的子模块才是重点 构建子模块Spring6-First 2.3. 程序开发
第1步 引入spring相关依赖
第2步 创建类定义属性和方法
第3步 按照spring要求创建配置文件(xml格式)
第4步 在spring配置文件配置相关信息
第5步 进行最终测试 第1步 引入Spring相关依赖
在Maven或Gradle项目中通过pom.xml或build.gradle文件添加Spring框架及其相关的依赖项例如Spring Core、Spring Context、Spring DAO等以便在项目中使用Spring的功能。 在子模块下的Spring-First的pom.xml文件配置以下依赖
!-- 依赖关系定义 --dependencies!-- 引入Spring Context依赖它是Spring框架的基础模块提供了环境配置、Bean生命周期管理、事件传播等功能 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.0.2/version/dependency!-- 引入JUnit5测试框架用于编写和运行单元测试 --dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-api/artifactIdversion5.3.1/version/dependency/dependencies 刷新后并查看依赖 第2步 创建类定义属性和方法
根据业务逻辑创建Java类包括实体类Entity、数据访问接口DAOData Access Object、实现类、服务类Service以及控制器类Controller等。在类中定义属性及相应的getter/setter方法以及业务处理方法。 第3步 按照Spring要求创建配置文件XML格式
在项目的资源目录下创建Spring的核心配置文件如applicationContext.xml或spring-config.xml用于配置Spring容器如何管理和装配bean。 在resources文件夹创建Spring配置文件名字无所谓但后缀要为 . xml
我这里为 bean.xml 第4步 在Spring配置文件配置相关信息
在配置文件中声明bean包括数据源、事务管理器、DAO实现类、服务类等并通过bean标签定义它们的生命周期和依赖关系也可以配置AOP、事务管理等相关设置。
创建完bean.xml配置文件后配置该文件像下面这样 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!-- 定义一个Bean实例id为helloWorld类型为com.sakurapaid.spring6_01.HelloWorld类 --bean idhelloWorld classcom.sakurapaid.spring6_01.HelloWorld/bean/beans
进一步说明
Bean在Spring框架中Bean是一个由Spring IoC控制反转容器管理的对象。它是由Spring容器负责创建、装配以及管理其完整生命周期的Java对象。
id属性每个Bean都需要一个唯一的标识符id就是用来满足这一需求的属性。通过这个唯一的ID开发者可以在Spring容器中方便地查找和获取所需的Bean。
class属性class属性指定用来创建Bean实例的Java类的全限定名。当Spring容器读取到这个配置时它会根据提供的类名创建对应的类实例并依据需要进行依赖注入和其他配置处理最终生成一个可操作的Bean对象供应用程序使用。 创建一个测试类HelloWorldTest并写上对应内容
package com.sakurapaid.spring6;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class HelloWorldTest {Testpublic void test() {//加载spring配置文件对象创建ApplicationContext context new ClassPathXmlApplicationContext(bean.xml);//获取创建对象HelloWorld helloWorld (HelloWorld) context.getBean(helloWorld);//调用方法输出结果helloWorld.sayHello();}
}第5步 进行最终测试
编写单元测试和集成测试确保各个组件能够按照预期与Spring容器一起工作。启动应用并测试整体功能是否正常如通过HTTP请求测试控制器层是否能正确调用服务层并返回响应。 2.4. 案例分析
1. 底层是怎么创建对象的是通过反射机制调用无参数构造方法吗
修改HelloWorld类
public class HelloWorld {//无参构造public HelloWorld() {System.out.println(这是无参构造输出的HelloWorld);}public void sayHello(){System.out.println(HelloWorld);}
} 执行结果 测试得知创建对象时确实调用了无参数构造方法。 Spring是如何创建对象的呢原理是什么
// dom4j解析beans.xml文件从中获取class属性值类的全类名// 通过反射机制调用无参数构造方法创建对象Class clazz Class.forName(com.sakurapaid.spring6.HelloWorld);//Object obj clazz.newInstance();Object object clazz.getDeclaredConstructor().newInstance();
当Spring框架读取配置文件如beans.xml时它会通过DOM4J等XML解析工具解析出各个bean的定义信息其中包括bean的类名。之后Spring利用Java反射机制通过Class.forName()方法加载指定类的字节码然后调用getDeclaredConstructor().newInstance()方法创建该类的对象实例这就相当于调用了无参构造函数来初始化对象。 把创建好的对象存储到一个什么样的数据结构当中了呢
bean对象最终存储在spring容器中在spring源码底层就是一个map集合存储bean的map在DefaultListableBeanFactory类中
private final MapString, BeanDefinition beanDefinitionMap new ConcurrentHashMap(256);
Spring容器加载到Bean类时 , 会把这个类的描述信息, 以包名加类名的方式存到beanDefinitionMap 中,MapString,BeanDefinition , 其中 String是Key , 默认是类名首字母小写 , BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象。 创建好的对象并不是立即丢弃而是由Spring IoCInversion of Control控制反转容器统一管理。在Spring的底层实现中对象是以Bean的形式存储在一个名为beanDefinitionMap的ConcurrentHashMap中。这个Map的键是Bean的名字通常是类名首字母小写遵循默认命名规则值是BeanDefinition对象。BeanDefinition是一个接口它包含了创建和配置Bean所需的所有元数据信息如类名、构造函数参数、属性值、依赖关系等。这样Spring容器就能根据需要随时查找、获取并初始化Bean对象。 Spring创建对象的过程
当你在Spring配置文件中定义了一个Bean比如HelloWorld类Spring会读取这个配置文件并找到你所指定的类名。然后Spring利用Java的反射API通过Class.forName()加载指定类的字节码也就是类的定义。接下来Spring调用类的无参构造方法即没有参数的构造函数来创建这个类的一个实例就像我们手动用new关键字创建对象一样。
Spring管理对象的方式
创建出来的对象并不是单独存在而是被Spring的IoC控制反转容器统一管理。这个容器实际上维护了一个类似字典的数据结构也就是一个Map具体是ConcurrentHashMap类型其中 键key是Bean的名称通常按照约定如类名首字母小写来命名。值value是BeanDefinition对象它包含了创建和配置Bean所需要的所有细节比如类的具体位置、属性值、依赖关系等。
简单来说Spring通过读取配置文件利用反射技术自动创建对象并把这些对象的相关信息保存在一个特殊的“容器”中。当你需要使用某个对象时只需告诉Spring它的名称Spring就会从容器中取出已经创建好的对象给你使用。这样不仅简化了对象的创建过程也使得对象间的依赖关系更容易管理和维护。这就是Spring框架的核心机制之一——IoC容器的作用。 总结起来就是Spring通过解析配置文件获取类的信息运用反射创建对象并将这些对象以及对象的配置信息以一种高效的数据结构Map进行管理实现了对Bean对象的集中控制和生命周期管理这就是Spring框架的核心功能之一——IoC容器的运作机制 2.5. Log4j2日志框架
2.5.1. Log4j2概述
Apache Log4j2 是一款专为Java应用程序设计的强大且灵活的开源日志框架。在软件开发领域尤其是在Java项目中日志扮演着至关重要的角色它能详尽地记录下系统运行过程中的各种事件和状态变化就像一本详细的电子日记涵盖了何时when、何地where、何种行为what以及为何发生why等重要信息。
Log4j2 是原始Log4j项目的重大升级版本相较于传统的System.out.println()方法它提供了更高级别的功能和控制能力使得开发者能够根据不同的需求定制日志输出格式、级别、存储位置等并且支持异步日志处理提高了系统的性能表现。 以下几个关键特性体现了Log4j2的优势
多级日志Log4j2 支持多种日志级别包括 TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL允许开发者根据实际需要调整日志详细程度确保既能获取足够的调试信息又不会因为过多的日志而影响性能或占用过多存储空间。配置灵活通过XML、JSON或Properties等格式的配置文件开发者可以轻松地定义日志输出的格式、过滤规则、输出目的地如控制台、文件、数据库等甚至可以动态地重新加载配置文件无需重启应用。性能优化Log4j2 引入了异步日志处理机制这意味着即使在大量日志生成的情况下也不会阻塞应用的主线程显著提升了系统的响应速度。扩展性好Log4j2 设计上考虑了扩展性开发者可以通过插件机制添加自定义的Appenders输出器、Filters过滤器和其他组件满足特定应用场景的需求。
总之Apache Log4j2 提供了一个全面、高效且可高度定制的日志解决方案有助于提高软件开发效率、简化运维工作并为系统的稳定性和可靠性提供有力支撑。对于任何Java项目特别是大型企业级应用来说选择Log4j2作为日志框架都是一个明智之举。 2.5.2. 引入Log4j2依赖
在pom.xml引入相关依赖
!--log4j2的依赖--
dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.19.0/version
/dependency
dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j2-impl/artifactIdversion2.19.0/version
/dependency 注意我这里是写在了父工程里的子工程(Spring6-First)里面的pom文件 2.5.3. 加入日志配置文件
在类的根路径下提供log4j2.xml配置文件文件名固定为log4j2.xml文件必须放到类根路径下。
?xml version1.0 encodingUTF-8?
configurationloggers!--level指定日志级别从低到高的优先级TRACE DEBUG INFO WARN ERROR FATALtrace追踪是最低的日志级别相当于追踪程序的执行debug调试一般在开发中都将其设置为最低的日志级别info信息输出重要的信息使用较多warn警告输出警告的信息error错误输出错误信息fatal严重错误--root levelDEBUGappender-ref refspring6log/appender-ref refRollingFile/appender-ref reflog//root/loggersappenders!--输出日志信息到控制台--console namespring6log targetSYSTEM_OUT!--控制日志输出的格式--PatternLayout pattern%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n//console!--文件会打印出所有信息这个log每次运行程序会自动清空由append属性决定适合临时测试用--File namelog fileNameF:/Program/Spring6Log/test.log appendfalsePatternLayout pattern%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n//File!-- 这个会打印出所有的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩作为存档--RollingFile nameRollingFile fileNameF:/Program/Spring6Log/app.logfilePatternlog/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gzPatternLayout pattern%d{yyyy-MM-dd at HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n/SizeBasedTriggeringPolicy size50MB/!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件这里设置了20 --DefaultRolloverStrategy max20//RollingFile/appenders
/configuration 在resources文件夹右键创建文件——log4j2.xml 注意log4j2日志运行时会在本地生产日志文件所以在配置文件里要设置日志文件的存放位置比如我这里就是F盘下的
F:/Program/Spring6Log/test.log 和 F:/Program/Spring6Log/app.log
根据自己的实际情况来 2.5.4. 测试
运行刚才的程序 HelloWorldTest.java得到运行结果 2.5.5. 手动使用日志
上述为自动写入日志其实也是可以手动写入日志的如下述步骤
把刚才的测试类改为这样
package com.sakurapaid.spring6_01;import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class HelloWorldTest {Testpublic void test() {//获取日志对象Logger logger LoggerFactory.getLogger(HelloWorldTest.class);//加载spring配置文件对象创建ApplicationContext context new ClassPathXmlApplicationContext(bean.xml);//获取创建对象HelloWorld helloWorld (HelloWorld) context.getBean(helloWorld);//调用方法输出结果helloWorld.sayHello();//输出日志logger.info(### 手动输入日志~);}}测试结果