- Spring是什么
- 一款主流的JAVA EE 轻量级开源框架
- Spring的划分方式 狭义的Spring:Spring Framework,通常将其称为Spring框架
- 两个核心模块:IOC、AOP
- IOC是什么:[控制反转]即把创建对象的过程交给Spring进行管理
- AOP是什么:[面向切面编程]封装多个类的公共行为,将与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统重复的代码,降低模块间的耦合度,另外,AOP好解决一些系统层面上的问题,如日志,事务,权限等
- SpringFramework的特点
- 非侵入式:使用该框架时,对应用程序本身的结构影响很小;对功能性组件只需要使用几个简单的注解进行标记,完全不会破坏原有结构,还能将组件结构进一步简化
- 控制反转:反转资源获取方向,把自己创建资源、向环境索取资源 变成 环境把资源准备好,我们享受资 源注入
- 面向切面编程:在不修改源代码的基础上增加代码功能
- 容器:Spring IOC 是一个容器,包含并且管理组件对象的生命周期。组件享受了容器化管理,PG屏蔽了组件过程中的大量细节,极大地降低了使用门槛。
- 组件化:把复杂应用拆分成多个简单组件,然后Spring 实现了将它们组合成一个复杂的应用。在Spring中可以使用XML和java注解组合这些对象
- 一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。 -Spring的模块组成和版本要求 -** Spring Core**
- Spring AOP
- Spring Data Access
- Spring Web
- Spring Message
- Spring test
- Spring 6的特点
- jdk 17
- Spring 6.0.2
- IDEA:2022.1.2
- 入门 -环境要求
- jdk17、Maven:3.6+,Spring:6.0.2
- maven:
-
bin:存放了 maven 的命令
-
boot:存放了一些 maven 本身的引导程序,如类加载器等
-
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
-
lib:存放了 maven 本身运行所需的一些 jar 包
-
maven的仓库:
-
Maven的仓库分类
-
本地仓库: 位于自己计算机中的仓库, 用来存储从远程仓库或中央仓库下载的插件和 jar 包
-
远程仓库: 需要联网才可以使用的仓库,阿里提供了一个免费的maven 远程仓库。
-
中央仓库: 在 maven 软件中内置一个远程仓库地址 repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件
-
maven仓库默认是在 C盘 .m2 目录下,不要将仓库放在C盘【D:\mvnrepository】
-
在IDEA中配置maven
-
-
报错1:
-
报错2:
-
入门案例-步骤
-
创建 maven 聚合工程
-
父工程 spring6 -子模块 spring-first
-
(1)引入spring相关依赖
-
(2)创建类,定义属性和方法
-
(3)按照spring 要求创建配置文件(xml格式)
-
(4)在spring配置文件中配置相关信息
-
(5)测试
-
案例说明:
-
(1)创建对象,无参构造会执行
-
(2)不使用new方式,使用反射机制实现的:
-
如何使用反射创建的对象?
-
2.1 加载bean.xml 配置文件
-
2.2 对xml文件进行解析操作
-
2.3 获取xml文件bean标签属性值:id属性值和class属性值
-
2.4 利用反射,根据类的全路径创建对象
-
Class clazz = Class.forName(class属性值);
-
(3)创建好的对象放到哪里?
-
创建好的对象放在Map集合中
-
Map<String,BeanDefinition>
-
key:唯一标识
-
value:描述信息
-
2.5 启用Log4j2日志框架
-
运行情况、错误信息
-
Apache Log4j2:开源日志记录组件 -重要组件构成 -(1)日志信息的优先级【低->高】:
-
TRACE:追踪
-
DEBUG:调试
-
INFO:信息,输出重要信息
-
WARN:警告,输出警告信息
-
ERROR:错误,输出错误信息
-
FATAL:严重错误 -级别高的会自动屏蔽级别低的日志 -(2)日志信息的输出目的地
-
指定了日志将打印到 控制台 还是 文件中 -(3)日志信息的输出格式
-
控制了日志信息的显示内容
-
引入Log4j2依赖
-
加入日志配置文件
-
测试-使用日志
-
报错:在引入log4j2依赖时报错:
-
处理方式:
- 加入配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<loggers>
<!--
level指定日志级别,从低到高的优先级:
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="d:/spring6_log/test.log" append = "false">
<PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss SSS}
[%t] %-5level %class{36} %L %M -%msg%xEx%n "/>
</File>
<!-- 这个会打印出所有的信息,每次大小超过size
则这个size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩
作为存档-->
<RollingFile name = "RollingFile" fileName = "d:/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" />
<SizeBaseTriggeringPolicy size = "50MB"/>
<!-- DefaultRolloverStrategy属性 如不设置
则默认最多同一个文件夹下7个文件,这里设置了20-->
<DefalutRolloverStrategy max = "20"/>
</RollingFile>
</appenders>
</configuration>
- 该日志是启动运行时日志,也可以手动向控制台写入日志
import com.lhm.spring6.User;
//手动日志所需要的包
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.lang.reflect.InvocationTargetException;
public class TestUser {
// 手动日志-创建log对象
private Logger logger = LogManager.getLogger(TestUser.class);
@Test
public void testUserObject() {
// 加载spring配置文件,对象创建
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
// 获取创建的对象
User user = (User) context.getBean("user");
System.out.println(user);
// 使用对象调用方法进行测试
user.add();
// 手动写日志
logger.info("执行调用成功..");
}
// 反射创建对象
@Test
public void testUserObject01() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 获取类Class对象
Class<?> clazz = Class.forName("com.lhm.spring6.User");
// 调用方法创建对象
User user = (User) clazz.getDeclaredConstructor().newInstance();
System.out.println(user);
}
}
-
导入的包还有第二种选择:
-
比如:org.slf4j.LoggerFactory
-
它们区别如下:
-
Log4j2 是一个具体的日志框架,提供了自己的日志记录器管理类
LogManager和日志记录器接口Logger。 -
SLF4J 是一个抽象层,通过
LoggerFactory提供了一种方式来获取日志记录器,这个日志记录器可以基于不同的具体日志框架进行切换和配置。 -
如果已经确定使用 Log4j2 作为日志框架,那么应该使用
org.apache.logging.log4j.LogManager和org.apache.logging.log4j.Logger来配置和记录日志。而如果你的应用中可能会使用不同的日志实现,你可以考虑使用 SLF4J 提供的抽象层,然后通过LoggerFactory获取日志记录器,在代码中更容易切换不同的日志框架。 -
IoC容器
-
Inversion of cxontrol
-
**Spring 通过 IoC容器 来 管理所有Java对象的实例化和初始化、控制对象与对象之间的依赖关系。
-
**将由IoC容器管理的Java对象称为Spring Bean,它与使用关键字new创建的Java对象没有任何区别。
-
IoC是Spring重要的核心组件之一。
-
- 控制反转
-
控制反转是什么?
-
-控制反转不是一门技术,而是一种设计思想。为了降低耦合度,提高程序扩展能力。
-
控制反转,反转的是什么?
-
- 将对象的创建权利交出去,交给第三方容器负责
-
- 将对象与对象之间的关系的维护全交出去,交给第三方容器负责
-
控制反转的思想如何实现?
-
- DI(Dependency Injection):依赖注入
-
容器中放的是bean对象,使用map集合(key-value)
-
2.依赖注入
-
依赖注入是什么?
-
- Spring创建对象的过程中,将对象依赖属性通过配置进行注入
-
依赖注入的常见实现方式:
-
- 第一种:set注入
-
- 第二种:构造注入