Spring
1、Spring框架概述
Spring 是轻量级的开源的 JavaEE 框架(jar包数量和体积都比较小)
Spring 可以解决企业应用开发的复杂性
-
Spring的两个核心部分:IOC、Aop
-
IOC:控制反转,把创建对象过程交给 Spring 进行管理
-
Aop:面向切面,不修改源代码进行功能增强
-
-
Spring的特点:
-
方便解耦,简化开发
-
Aop编程支持
-
方便程序测试
-
方便和其他框架进行整合
-
方便进行事务操作
-
-
1.1、Spring的一个例子
-
第一步:下载Spring
-
第二步:创建普通java工程,导入相关jar包
需要导入beans
, core
, context
, expression
, commons-logging
5个jar包
(Spring5模块中Core Container部分)
-
第三步:创建普通类,类中创建普通方法
-
第四步:创建Spring配置文件,在配置文件中配置想要创建的对象
-
第五步:测试
项目结构:
2、IOC容器
2.1、IOC原理
IOC:Inversion of Control,控制反转,面向对象的一种设计原则。将对象创建和对象之间调用的过程交给Spring进行管理,使耦合度降低。
-
IOC底层原理:
2.2、IOC接口(BeanFactory)
IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
IOC容器实现的两种方式(两个接口):
-
BeanFactory:
-
IOC 容器的基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
-
加载配置文件时候不会创建对象,在获取对象(使用时,即上文第五步中的2.)才去创建对象
-
-
ApplicationContext:
-
BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
-
加载xml配置文件时候就会把在配置文件中的对象进行创建
-
理论上使用时再创建对象更好,但实际web项目中,通常将耗时耗资源的操作放在最开始一起执行,所以使用ApplicationContext更合适
-
ApplicationContext的实现类
idea中快捷键ctrl+h
查看
-
-
FileSystemXmlApplicationContext
:使用xml文件的绝对路径 -
ClassPathXmlApplicationContext
:使用xml文件的类加载路径
-
BeanDefinition
Bean对象存在依赖嵌套等关系,所以设计者设计了BeanDefinition,它用来对Bean对象及关系定义;
我们在理解时只需要抓住如下三个要点:
-
BeanDefinition 定义了各种Bean对象及其相互的关系
-
BeanDefinitionReader 这是BeanDefinition的解析器
-
BeanDefinitionHolder 这是BeanDefination的包装类,用来存储BeanDefinition,name以及aliases等。
2.3、IOC操作Bean管理(基于xml)
Bean管理:包括两个操作,Spring创建对象和Spring注入属性
Bean管理操作的两种方式:基于xml、基于注解
基于xml方式创建对象
在spring配置文件中使用bean标签,并添加对应属性,就可以实现对象创建(默认使用无参构造创建对象)
属性名 | 用途 |
---|---|
id | 配置和使用对象的唯一标识 |
class | 对象所在类的全路径 |
基于xml方式注入属性
DI:依赖注入,也就是注入属性
第一种注入方式:使用set方法
-
创建类,定义属性和对应的set方法
-
在spring配置文件配置对象创建和属性注入
第二种注入方式:使用有参构造
-
创建类,定义属性,创建属性对应的有参构造
-
在spring配置文件中进行配置
简化的xml注入方式:p名称空间注入(实际上还是set方法)
-
在配置文件中添加p名称空间
-
在bean标签内进行属性注入
xml注入其他类型属性
设置特殊属性值
外部bean:直接在beans标签内部直接定义的bean对象,外部bean可以被多个bean对象引用
将对象作为属性注入
例如:在service类中调用dao类的方法
-
原始方式:在UserService类中创建UserDao对象,通过对象调用方法
-
外部bean注入方式:
-
在UserService类中创建UserDao类型的属性,生成set方法
-
配置xml文件:创建service和dao对象、向userService中注入userDao对象
-
内部bean:将一个 bean 用作另一个 bean 的属性
在某个bean标签的内部定义的bean对象,内部bean只能被某个对象的某个属性引用。
例如:一对多关系,员工和部门
级联赋值:在一个bean对象中注入另一个bean对象(外部bean)的属性并对该属性进行赋值。
方法一:
方法二:
xml注入集合类型属性
注入的集合为多个对象的集合
提取集合作为公共部分(让不同的类都能使用这个集合)
2.4、FactoryBean
普通bean:配置文件中定义的bean类型class
就是返回类型(配置文件中的bean
即为创建对象操作)
FactoryBean:配置文件定义的类型class
和返回类型不同
2.5、Bean的作用域
在spring中默认情况下bean是单实例对象(多次创建的对象内存地址相同,说明是同一个对象)
通过改变配置文件中的scope
可以设置单实例或多实例:
-
scope = singleton
时,加载 spring 配置文件时就创建单实例对象 -
scope = prototype
时,在调用 getBean 方法时创建多实例对象
2.6、Bean的生命周期
生命周期:从对象创建到对象销毁的过程
-
Bean的生命周期:
-
通过构造器创建bean实例(无参构造)
-
设置bean属性值,直接设置或引用其他bean(调用set方法)
-
调用bean中初始化方法(需要配置)
-
使用bean(获取到了对象)
-
当容器关闭时,调用bean的销毁方法(需要配置)
-
bean的后置处理器:创建类,实现接口BeanPostProcessor
,创建后置处理器;重写的两个方法分别在初始化之前和初始化之后执行
2.7、自动装配
自动装配:根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入
2.8、外部属性文件
-
引入外部属性文件:
-
引入context名称空间
-
引入外部属性文件
-
例如:配置数据库信息
2.9、IOC操作Bean管理(基于注解)
-
什么是注解:
-
注解是代码特殊标记,格式:
@注解名称(属性名称=属性值,属性名称=属性值...)
-
注解可以作用在类、方法、属性上
-
使用注解的目的:简化xml配置,直接用注解就可以替代
-
基于注解创建对象
-
Spring针对Bean管理中用于创建对象的注解(功能相同):
-
@Component
:创建对象并标识为普通组件 -
@Service
:创建对象并标识为业务层组件 -
@Controller
:创建对象并标识为控制层组件 -
@Repository
:创建对象并标识为持久层组件
-
-
基于注解方式实现对象创建的步骤:
-
导入aop依赖
spring-aop-5.2.6.RELEASE.jar
-
开启组件扫描(即扫描注解)(需要先引入context名称空间)
-
创建类,在类上添加创建对象的注解
-
-
开启组件扫描细节配置(设置扫描过滤器)
基于注解注入属性
-
Spring基于注解进行属性注入的常用注解:
-
@AutoWired
:根据属性类型自动装配 -
@Qualifier
:根据属性名称进行注入 -
@Resource
:可以根据类型,也可以根据名称注入 -
@Value
:注入普通类型属性
-
-
使用
@AutoWired
基于注解进行属性注入:(以UserDao接口, UserDaoImpl实现类, UserService1类为例)
-
创建service和dao对象:在service和dao类中添加创建对象注解
-
在service中注入dao对象:在service类中添加dao类型属性,在属性上使用注解
-
-
使用
@Qualifier
基于注解进行属性注入:@Qualifier
需要和@Autowired
一起使用-
创建service和dao对象:在service和dao类中添加创建对象注解
-
在service中注入dao对象:在service类中添加dao类型属性,在属性上使用注解,设置和dao对象相同的value值
-
-
使用
@Resource
基于注解进行属性注入:如果
@Resource
无法使用,需要先导入jar包javax.annotation-api-1.3.2.jar
-
使用
@Value
基于注解进行属性注入:@Value
可以注入普通类型的属性
完全注解开发
-
创建配置类,替代xml配置文件
-
改写测试类
实际开发中一般使用Springboot进行完全注解开发
3、Aop
3.1、AOP原理
-
什么是AOP:
-
AOP底层原理:
3.2、JDK动态代理
-
使用Proxy类里面的方法创建代理对象,调用
newProxyInstance
方法newProxyInstance
方法的三个参数:-
类加载器
-
增强方法所在的类实现的接口,支持多个接口
-
实现接口
InvocationHandler
,创建代理对象,写增强的方法
-
-
编写JDK动态代理代码
-
创建接口,定义方法
-
创建接口实现类,实现方法
-
使用Proxy类创建接口代理对象
-
3.3、AOP术语
-
连接点:类中可以被增强的方法
-
切入点:实际被增强的方法
-
通知(增强):实际增强的逻辑部分
-
通知有多种类型:
-
前置通知:增强部分在方法执行前执行
-
后置通知:增强部分在方法执行后执行
-
环绕通知:增强部分在方法执行前后都有执行
-
异常通知:增强部分在方法出现异常时执行
-
最终通知:类似
finally
,无论如何增强部分最后都会执行
-
-
-
切面:把通知应用到切入点的过程就是切面(切面是一个动作)(即加入增强功能)
3.4、AOP操作的准备工作
-
Spring 框架一般都是基于 AspectJ 实现 AOP 操作
AspectJ 不是 Spring 组成部分,是独立的 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用进行 AOP 操作
-
基于 AspectJ 实现 AOP 操作
-
基于xml配置文件实现
-
基于注解方式实现
-
-
需要引入的相关依赖
-
切入点表达式
-
切入点表达式的作用:说明要对哪个类的哪个方法进行增强
-
语法结构:
execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))
-
3.5、AOP操作(使用AspectJ注解)
-
使用AspectJ注解进行AOP操作的步骤:
-
创建类,在类中定义方法
-
创建增强类(编写增强逻辑)
-
在增强类中创建方法,让不同方法代表不同通知(增强)类型
-
-
进行通知的配置
-
在spring配置文件中开启注解扫描
-
使用注解创建User和UserProxy类的对象
-
在增强类上添加注解
@Aspect
,生成代理对象 -
在spring配置文件中开启生成代理对象(对包含注解
@Aspect
的类生成代理对象)
-
-
配置不同类型的通知
-
在增强类中通知方法上面添加通知类型注解,并使用切入点表达式配置
-
-
-
使用
@Pointcut
在增强的类中抽取相同的切入点
-
当有多个增强类对同一个方法进行增强时,可以设置增强类的优先级
在增强类上面添加注解
@Order(数字类型值)
,值越小优先级越高(注意是对类设置)
-
完全使用注解开发
创建配置类,不需要创建xml配置文件
3.6、AOP操作(使用AspectJ配置文件)
了解即可
-
使用AspectJ配置文件进行AOP操作的步骤:
-
创建两个类,增强类和被增强类,创建方法
-
在spring配置文件中创建两个类对象
-
在spring配置文件中配置切入点
-
4、JdbcTemplate
4.1、概念和准备
-
什么是JdbcTemplate
-
JdbcTemplate 是 Spring 框架对 JDBC 的封装,使用 JdbcTemplate 可以方便的实现对数据库操作
-
-
准备工作
4.2、JdbcTemplate操作数据库(增删改)
-
JdbcTemplate添加数据步骤:
-
对应数据库创建实体类,生成
getter
和setter
方法 -
编写service和dao
-
在dao中进行数据库添加操作,调用
JdbcTemplate.update()
方法,方法的第一个参数是sql语句,第二个参数是可变参数,填充占位符的值
-
-
测试类
-
4.3、JdbcTemplate操作数据库(查询)
-
查询返回某个值:
jdbcTemplate.queryForObject
-
查询返回对象:
jdbcTemplate.queryForObject
queryForObject的三个参数: 第一个为sql语句 第二个为RowMapper接口,使用接口中的实现类可以封装查询返回的数据 第三个为sql语句中的值
-
查询返回集合:
jdbcTemplate.query
4.4、JdbcTemplate操作数据库(批量操作)
批量操作方法:jdbcTemplate.batchUpdate
-
批量修改:
jdbcTemplate.batchUpdate
-
批量删除:
jdbcTemplate.batchUpdate
5、事务管理
5.1、事务概念
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
5.2、搭建事务操作环境
-
数据库中创建表,添加记录
以转账为例
-
创建service,搭建dao,完成对象创建和建立注入关系
-
在service中注入dao,在dao注入JdbcTemplate,在JdbcTemplate中注入DataSource
-
-
在dao中创建增加money和减少money的两个方法(也可以写成同一个修改money的方法),在service中创建转账的方法
事务操作过程:开启事务,进行业务操作,没有发生异常则提交事务,出现异常时事务回滚
5.3、Spring事务管理介绍
建议将事务添加到JavaEE三层结构(Web Service Dao)的Service层(业务逻辑层)
在Spring中进行事务管理操作有两种方式:编程式事务管理、声明式事务管理(常用)
-
声明式事务管理:声明式事务管理底层使用的是AOP
-
基于注解方式(最常用)
-
基于xml配置文件方式
-
Spring事务管理API:Spring提供了一个接口PlatformTransactionManager
,代表事务管理器,针对不同的数据库操作框架提供了不同的实现类,对于JdbcTemplate使用DataSourceTransactionManager
5.4、基于注解的声明式事务管理
-
使用基于注解的声明式事务管理的步骤:
-
在spring配置文件中配置事务管理器
-
在spring配置文件中引入
tx
名称空间,开启事务注解 -
在service类(或类中的方法)上添加事务注解
@Transactional
,如果在类上添加则说明对类中每一个方法都启用事务
-
5.5、声明式事务管理的参数配置
在service类添加的注解@Transactional
中可以配置事务相关参数
-
propagation()
:事务传播行为 -
isolation()
:事务隔离级别 -
timeout
:超时时间-
超时不提交自动回滚
-
默认为-1,时间以秒为单位,通过timeout配置
-
-
readOnly
:是否只读-
默认为false,表示可增删改查
-
通过readOnly配置
-
-
rollbackFor
:回滚-
设置出现哪些异常时进行事务回滚
-
-
noRollbackFor
:不回滚-
设置出现哪些异常时不回滚
-
5.6、基于xml的声明式事务管理
-
基于xml进行声明式事务管理的步骤:
-
在Spring配置文件中进行配置
-
配置事务管理器
-
配置通知
-
配置切入点和切面
-
-
5.7、完全注解声明式事务管理
-
完全注解声明式事务管理步骤
-
创建配置类,使用配置类代替xml配置文件
-
6、Spring5新特性
6.1、整合日志框架
整个 Spring5 框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除
Spring 5.0 框架自带了通用的日志封装 Log4j2
-
Spring5.0中使用Log4j2的步骤:
-
导入jar包:
log4j-api-2.11.2.jar
,log4j-core-2.11.2.jar
,log4j-slf4j-impl-2.11.2.jar
,slf4j-api-1.7.30.jar
-
创建log4j2.xml配置文件
-
6.2、@Nullable注解
Spring5 框架核心容器支持 @Nullable
注解
@Nullable
注解可以使用在方法上,属性上,方法的参数上,表示方法返回可以为空,属性值可以为空,参数值可以为空
6.3、函数式注册对象
Spring5 核心容器支持函数式风格 GenericApplicationContext
6.4、整合JUnit5单元测试框架
Spring5 支持整合 JUnit5
-
整合JUnit4
-
引入相关jar包:
spring-test-5.2.6.RELEASE.jar
-
使用注解方式创建测试类
-
-
整合JUnit5
-
引入相关依赖:
JUnit5
-
使用注解创建测试类
-
6.5、SpringWerflux使用
SpringWebflux介绍
前置知识:SpringMVC、Springboot、Maven、Java8新特性
SpringWebflux 是 Spring5 添加新的模块,用于 web 开发,功能和 SpringMVC 类似,Webflux 使用当前一种比较流程响应式编程出现的框架。
传统 web 框架,比如 SpringMVC,基于 Servlet 容器,Webflux 是一种异步非阻塞的框架,异步非阻塞的框架在 Servlet3.1 以后才支持,核心是基于 Reactor 的相关 API 实现的。
异步非阻塞: 异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步,如果发送请求之后不等着对方回应就去做其他事情就是异步; 阻塞和非阻塞针对被调用者,被调用者受到请求之后,做完请求任务之后才给出反馈就是阻塞,受到请求之后马上给出反馈然后再去做事情就是非阻塞。
Webflux的特点: 第一 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以 Reactor 为基础实现响应式编程 第二 函数式编程:Spring5 框架基于 java8,Webflux 使用 Java8 函数式编程方式实现路由请求
Webflux和SpringMVC: 第一 两个框架都可以使用注解方式,都运行在 Tomet 等容器中 第二 SpringMVC 采用命令式编程,Webflux 采用异步响应式编程
响应式编程
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。
Webflux执行流程和核心API
SpringWebflux(基于注解编程模型)
SpringWebflux(基于函数式编程模型)
__EOF__

本文链接:https://www.cnblogs.com/colinpersonalblog/p/16641533.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)