Spring6 介绍:
- 发布时间:2022年11月
- Spring 框架是一款优秀的轻量级开源框架,为了解决企业应用开发的复杂性而出现
- Spring 框架的用途:服务器端的开发
- 特点:简单性、可测试性、松耦合性
学习 Spring6 的前置知识:
- Java 基础知识(反射)
- Java 注解
- XML
- Maven
一、Spring 概述
1.1 Spring 是什么?
Spring 是一款主流的 Java EE 轻量级开源框架。
Spring 的作用:用于简化 Java 企业级应用的开发难度和开发周期
开始发布时间:2004年4月,Spring 1.0 版本正式发布。
1.2 Spring 广义和狭义划分
(一)广义的 Spring:Spring 技术栈
泛指以 Spring Framework 为核心的 Spring 技术栈。
例如:Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security等
(二)狭义的 Spring:Spring Framework
特指:Spring Framework,通常我们将它称为 Spring 框架
Spring 框架是一个分层的、面向切面的 Java 应用程序的一站式轻量级解决方案。
Spring 有两个最核心模块:IoC 和 AOP
1、IoC
IoC(Inverse of Control :控制反转):指把创建对象过程交给 Spring 进行管理。
2、AOP
AOP(Aspect Oriented Programming:面向切面编程):
- 一种编程范式,用于将横切关注点(如日志、安全等)与业务逻辑分离,从而提高代码的模块化和可维护性。
- AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。
1.3 Spring Framework 的特点
- 非侵入式(在使用 Spring 时候不需要依赖其他组件就可以直接使用)
- Spring 对应用程序本身的结构影响非常小,对领域模型可以做到零污染
- 对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构
- 控制反转(IoC)
- 翻转资源获取方向,把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。
- 面向切面编程(AOP)
- 在不修改源代码的基础上增强代码功能。
- 容器
- Spring IoC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。
- 组件化
- 使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统
- 一站式
- 在 IoC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且 Spring 旗下的项目已经涵盖了广泛的领域,很多方面的功能性需求可以在 Spring Framework 的基础上全部使用 Spring 来实现。
1.4 Spring 模块的
官网:https://spring.io
Spring 6 要求的 JDK 版本是 JDK 17
二、Spring 6 入门
2.1 笔记中涉及到的环境:
- JDK :Java 17
- Maven:3.9.6
- Spring:
基本开发步骤:
父工程
子模块
2.2 构建模块
2.3.1 引入依赖
htttp://spring.io/projects/spring-framework#learn
添加依赖:
<dependencies>
<!--spring context 依赖-->
<!--当你引入 Spring Context依赖后,表示将 Spring 的基础依赖引入了-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
</dependency>
<!--junit-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.2</version>
</dependency>
</dependencies>
2.3.2 程序分析
1、之前创建对象,无参构造执行吗?—— 执行
无参构造执行
2、不用 new 方式,还可以如何创建对象?——反射
3、创建对象放到哪里?
2.5 启用 Log4j2 日志框架
2.5.1 Log4j2 日志概述
日志很重要。
日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能够及时提醒我们处理,同时在系统产生问题时,能够帮助我们快速定位、诊断并解决问题。
Apache Log4j2 是一个开源的日志记录组件,使用非常的广泛,在工程中以易用方便代替了 System.out 等打印语句,它是Java 下最流行的日志输入工具
Log4j2 主要由几个重要的组件构成:
2.5.2 引入 Log4j2 依赖
<!--log4j2的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.19.0</version>
</dependency>
2.5.3 加入日志配置文件
在类的根路径下提供 log4j2.xml 配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<loggers>
<!--
level 指定日志级别,从低到高的优先级:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
trace:追踪,是最低的日志级别,相当于追踪程序的执行
debug:调试,一般在开发中,都将其设置为最低的日志级别
info:信息,输出重要的信息,使用较多
warn:警告,输出警告的信息
error:错误,输出错误信息
fatal:严重错误
-->
<root level="DEBUG">
<appender-ref ref="spring6log"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="log"/>
</root>
</loggers>
<appenders>
<!--输出日志信息到控制台-->
<console name="spring6log" target="SYSTEM_OUT">
<!--控制日志输出的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss sss} [%t] %-3level %logger{1024} - %msg%n"/>
</console>
<!--文件会打印出所有信息,这个 log 每次运行程序会自动清空,由 append 属性决定,适合临时测试用-->
<File name="log" fileName="f:/spring6_log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss sss} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--这个会打印出所有的信息
每次大小超过 size
则这 size 大小的日志会自动存入按年份-月份建立的文件夹下面进行压缩,
作为存档
-->
<RollingFile name="RollingFile" fileName="f:/spring6_log/app.log" filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
<!-- DefaultRolloverStrategy 属性若不设置,
则默认为最多同一文件夹下 7 个文件,这里设置了 30-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</appenders>
</configuration>
2.5.4 测试
2.5.5 使用日志
三、容器:IoC
IoC(Inversion of Control:控制反转):是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。
Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。
- 容器 Bean 对象:使用的是 map 集合;因为map 集合,key-value
- 实例化的方式:
- new
- 使用 工厂
- 使用 反射
IoC 容器是 Spring 框架中的最重要的核心组件之一,它贯穿了 Spring 从诞生到成长的整个过程。
3.1 IoC 容器
3.1.1 控制反转(IoC)
- 控制反转是一种思想
- 控制反转是为了降低程序耦合度,提高程序扩展力
- 控制反转,反转的是什么?
- 将对象的创建权利交出去,交给第三方容器负责
- 将对象和对象之间关系的维护权交出去,交给第三方容器负责
- 控制反转这种思想如何实现?
- DI(Dependency Injection):依赖注入
IoC 容器中的过程:
3.1.2 依赖注入
依赖注入:实现了控制反转的思想
依赖注入:指 Spring 创建对象的过程中,将对象依赖属性通过配置进行注入。
依赖注入常见的实现方式包括两种:
- 第一种:set 注入
- 第二种:构造注入
package com.atguigu.spring6.iocxml.di;
public class Book {
private String name;
private String author;
//生成构造
//无参构造
public Book() {}
//有参构造
public Book(String name, String author) {
this.name = name;
this.author = author;
}
//生成set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public static void main(String[] args) {
// set 方法注入
Book book = new Book();
book.setName("java");
book.setAuthor("Max");
//通过构造器注入
Book book1 = new Book("c++", "max");
}
}
IoC 是一种控制反转的思想,而 DI 是对 IoC 的一种具体实现。
Bean 管理说的是:Bean 对象的创建,以及 Bean 对象中属性