Spring5
0|11、Spring是轻量级开源JavaEE框架
0|22、Spring可以解决企业应用开发的复杂性
0|33、组成核心IOC、Aop
-
IOC:控制反转,把创建对象过程交给Spring进行管理
-
Aop:面向切面,不修改源代码进行功能增强
0|44、Spring特点
- 方便解耦,简化开发
- Aop编程支持
- 方便程序测试
- 方便集成各种优秀框架
- 方便进行事务管理
- 降低java api的使用难度
*此文档版本为Spring5
1|0IOC
1|1什么是IOC
(1)控制反转,把对象的创建和对象之间调用的过程,交给Spring进行管理
(2) 使用IOC的目的:为了降低耦合
(3) 做入门案例就是IOC的实现
IOC底层原理
(1) xml解析、工厂模式、反射
IOC过程 (进一步降低耦合度)
第一步 xml配置文件,配置创建的对象
第二步 有service类和dao类 创建工厂类
IOC接口
-
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
-
Spring提供IOC容器实现两种方式:(两个接口)
- BeanFactory :IOC容器基本实现,是Spring内部的使用接口,不提供给开发人员使用
- 加载配置文件时不会创建对象,获取\使用对象时才会创建对象
- ApplicationContext :BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员使用
- 加载配置文件时就会把配置文件中对象创建(服务器启动时创建)
ApplicationContext接口有实现类
1|2IOC操作 Bean管理
什么是Bean管理
包含以下两个操作
- Spring创建对象
- Spring注入属性
Bean管理操作
1 bean创建对象
1 基于xml配置文件方式
(1)在Spring配置文件中,使用bean标签,标签里添加对应属性,就可以实现对象创建
(2)在bean标签中有很多属性:
-
id属性:唯一标识(不能加特殊符号)
-
class属性:类全路径(包类路径)
-
name:类似id(可添加特殊符号)
(3)创建对象的时候,默认也是执行无参构造方法
2 基于注解方式
2 基于xml注入属性
(1) DI:依赖注入,就是注入属性(DI是IOC的一种具体实现,在创建对象的基础之上进行)
第一种注入方式:使用set方法进行注入
第一步:创建类、创建属性、创建对应的set方法
第二步:在Spring配置文件配置对象创建,配置属性注入
第二种注入方法:使用有参构造进行注入
第一步:创建类 ,定义属性,创建属性对应有参构造方法
第二步:在Spring的配置文件中进行配置
第三种注入方式:P名称空间注入(底层使用的还是set方法注入)
使用p名称空间注入,可以简化基于xml配置方式
- 添加p名称空间在配置文件中
-
进行属性注入,在bean标签里面进行操作
xml注入其他类型属性
字面量:固定值
-
null值
-
属性包含特殊符号
注入属性-外部bean
-
创建两个类service类和dao类
-
在service调用dao里面的方法
-
在Spring配置文件中进行文件配置
注入属性-内部bean
-
一对多关系,部门和员工
一个部门有多个员工,一个员工属于一个部门。 部门是一 员工是多
-
在实体类之间表示一对多关系
员工表示所属部门,使用对象类型进行表示
-
在Spring配置文件中进行配置
注入属性-级联赋值
第一种写法
第二种写法 类中需要写get方法
xml注入集合属性
-
注入数组类型属性
-
注入List集合属性
-
注入Map集合类型属性
-
注入set集合类型属性
创建类,定义数组、list、map、set类型属性,生成对应set方法
在Spring配置文件进行配置
-
在集合里设置对象类型值
-
把集合注入部分提取出来
- 在Spring配置文件中引入空间名称util
-
使用util标签完成list集合注入提取
FactorBean
Spring里有两种bean,一种普通的bean。另外一种是FactoryBean(Spring内置的)
普通bean
Spring配置文件中定义bean类型即为返回类型
FactoryBean
Spring配置文件中定义bean类型可与返回类型不同
-
创建类,让这个类作为工厂bean,实现接口FactoryBean
-
实现接口里面的方法,在实现的方法中定义返回的bean类型
配置文件
bean的作用域
-
在Spring里,默认设置下,bean是单实例对象
输出显示地址相同为单实例对象:
-
如何设置单实例或多实例
(1)在Spring配置文件bean标签里面有用于设置的属性(scope)
(2)scope属性值
- 默认值:singleton,表示单实例对象
- prototype,表示多实例对象
两对象地址不同:
-
singleton和prototype区别
- singleton表示单实例,prototype多实例
- 设置scope值是singleton时,加载Spring配置文件时就会创建单实例对象
- 设置scope值是prototype时,不是在加载Spring配置文件时创建对象,在调用getBean方法时创建多例对象
Bean生命周期
从对象的创建到生命的销毁的过程
bean生命周期:
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和对其他bean的引用(调用set方法)
把bean实例传给bean后置处理器的方法postProcessBeforeInitialization(bean的后置处理器BeanPostProcessor,bean共有7步)
-
调用bean初始化的方法(需要进行配置)
把bean实例传给bean后置处理器的另外一个方法postProcessAfterInitialization(bean的后置处理器BeanPostProcessor,bean共有7步)
-
bean可以使用了(对象获取到了)
-
当容器关闭时,调用bean的销毁的方法(需要进行配置销毁的方法)
添加后置处理器之后:
-
创建类,实现接口BeanPostProcessor,创建后置处理器
IOC操作Bean管理(xml自动装配)
什么是自动装配?
根据指定装配规则(属性名称或属性类型),Spring自动将匹配的属性值进行注入
演示自动装配过程:
根据属性名称自动注入
根据属性类型自动注入
IOC操作Bean管理(外部属性文件)
-
直接配置数据库信息
1.配置德鲁伊连接池(Druid连接池,阿里巴巴)
2.引入德鲁伊连接池依赖jar包
-
引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties格式文件,写数据库信息
properties文件存储key:value格式配置
(2)把外部properties属性文件引入到Spring配置文件中
-
引入context名称空间
-
在Spring配置文件标签引入外部属性文件
-
IOC操作Bean管理(基于注解方式)
什么是注解?
-
注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值。。。)
-
使用注解,注解作用在类、方法、属性上面
-
使用注解的目的:简化xml配置
Spring针对Bean管理中创建对象提供注解:
-
@Component
-
@Service
-
@Controller
-
@Repository
*四个注解功能相同,都可以用来创建bean对象
基于注解方式实现对象的创建:
-
引入依赖
-
开启组件扫描
-
创建类,在类上面添加创建对象注解
-
开启组件扫描的细节配置
-
基于注解方式实现属性注入
-
@AutoWired:根据属性类型进行自动装配
①把service和dao对象创建,在service和dao类添加创建对象注解
②在service注入dao对象,在service类添加dao类型属性,在属性前使用注解
-
@Qualifier:根据属性名称进行注入
此注解的使用需要与@Autowired一起使用
-
@Resource:(javax中的注解,jdk11之后移除)可以根据类型注入,可以根据名称注入
-
@Value:注入普通类型属性
-
-
完全注解开发
(1)创建配置类,替代xml配置文件
(2)编写测试类
2|0AOP
什么是AOP?
面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率。
通俗描述:可不修改源代码,在主干功能里添加新的功能
例子:在原登录基础上添加权限判断
2|1AOP底层原理
AOP底层使用动态代理
有两种情况的动态代理
2|2AOP底层原理(JDK动态代理)
使用JDK动态代理,使用Proxy类里面的方法创建代理对象
调用newProxyInstans方法
- 类加载器
- 增强方法所在的类,这个类实现的接口,支持多个接口
- 实现这个接口InvocationHandler,创建代理对象,写增强方法
编写JDK动态代理代码:
-
创建接口,定义方法
-
创建接口实现类,实现方法(原功能)
-
使用Proxy类创建接口代理对象(加新功能)
2|3AOP(术语)
-
连接点:类里面可以被增强的方法
-
切入点:类里面实际被增强的方法
-
通知(增强):实际增强的逻辑部分(新加的部分)
*假如add()方法被增强
- 前置通知:add()之前执行的增强
- 后置通知:add()之后执行的增强
- 环绕通知:add()之前之后都执行的增强
- 异常通知:add()异常时执行的增强
- 最终通知:return之后执行的增强,后置通知之后,有异常时不执行
-
切面(动作)
把通知应用到切入点的过程
2|4AOP操作(准备)
1、Spring框架中一般基于AspectJ实现AOP操作
AspectJ:AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作
2、基于AspectJ实现AOP操作有两种方式:
- 基于xml配置文件使用
- 基于注解方式实现(使用)
3、在项目工程里引入AOP相关依赖
4、切入点表达式
-
切入点表达式的作用:知道对哪个类里面哪个方法进行增强
-
语法结构:
execution([权限修饰符] [返回类型] [类全路径] [方法名称] ([参数列表]))
例1:对com.atguigu.dao.BookDao类里面的add方法进行增强
execution(public void com.atguigu.dao.BookDao.add(int a,int b))
权限修饰符可省略,默认public
返回类型可以用*号表示全类型
execution(* com.atguigu.dao.BookDao.add(int a,int b))
例2:对com.atguigu.dao.BookDao类里面的所有方法进行增强
execution(* com.atguigu.dao.BookDao.*(..))
例3:对com.atguigu.dao包里的所有类,类里的所有方法进行增强
execution(* com.atguigu.dao..(..))
2|5AOP(AspectJ注解)
演示:
-
创建类,在类里定义方法
-
创建增强类
-
在增强类里面,创建方法,让不同方法代表不同通知类型
-
-
进行通知的配置
-
在Spring配置文件中,开启注解的扫描
-
使用注解创建User和UserProxy对象
-
在增强类上面添加注解@Aspect
-
在Spring配置文件中开启生成代理对象
-
配置不同类型通知
-
在增强类的里面,在通知方法上面添加通知类型的注解,使用切入点表达式配置
-
@Before
-
@After
-
@AfterReturning
-
@AfterThrowing
-
@Around
-
-
公共切入点
-
多个增强类对同一个切入点增强时,可设置优先级
在增强类上面加一个注释@Order(数字类型值),数字类型值越小它的优先级越高(值从0开始)
-
完全使用注解开发
创建配置类(config),不需要创建xml配置文件
-
2|6AOP(AspectJxml配置文件)
-
创建两个类:增强类和被增强类,创建方法
-
在Spring配置文件中创建两个类的对象
-
在Spring配置文件中配置切入点
3|0JdbcTemplate
Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作
3|1JdbcTemplate使用准备工作
3|2JdbcTemplate操作数据库(添加)
-
对应数据库创建
-
编写service和dao
-
在dao进行数据库添加操作
-
调用JdbcTemplate中的update()实现添加操作
有两个参数:
-
测试类
-
3|3JdbcTemplate操作数据库(修改和删除)
- 方法的实现
-
测试
3|4JdbcTemplate操作数据库(查询)
查询返回某个值
-
场景:查询表里有多少条记录,返回是某个值
-
使用JdbcTemplate实现查询返回某个值
有两个参数:
- sql语句
- 返回类型Class
查询返回对象
-
场景:查询图书详情
-
JdbcTemplate实现查询返回对象
jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper
(Book.class), id); 三个参数:
-
sql语句
-
RowMapper,是接口,返回不同类型的数据,使用这个接口里面的实现类完成数据封装
-
传递sql语句中?(占位符)的值
-
查询返回集合
-
场景:查询图书列表分页
-
调用JdbcTemplate实现查询返回集合
jdbcTemplate.query(sql, new BeanPropertyRowMapper
(Book.class)); 三个参数:
-
sql语句
-
RowMapper,是接口,返回不同类型的数据,使用这个接口里面的实现类完成数据封装
-
传递sql语句中?(占位符)的值
*第三个参数也可不写
-
3|5JdbcTemplate操作数据库(批量)
4|0事务操作
1、事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败则全失败
典型场景:银行转账:
- lucy转账100元给mary
- lucy少100,mary多100
2、事务的四个特性(ACID):
(1)原子性(atomicity):成功都成功,失败都失败
(2)一致性(consistency):操作之前和操作之后总量不变
(3)隔离性(isolation):多事务操作时,之间不会产生影响
(4)持久性(durability):提交之后表中数据就会发生变化
4|1事务操作(搭建事务操作环境)
典型场景:银行转账:
- 创建数据库,添加记录
-
创建service,搭建dao,完成对象创建和注入关系
-
service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DateSource
-
-
-
-
-
在dao创建两个方:多钱和少钱,在service创建转账方法
-
以上代码如果正常执行是没有问题的,但是如果以上代码出现异常,有问题,则应符合原子性和一致性,账户数据都不变
4|2事务管理(Spring事务管理介绍)
- 事务一般添加到JavaEE三层结构里的service层(业务逻辑层)
- 在Spring进行事务管理操作有两种方式
- 编程式事务管理
- 声明式事务管理(常用)
- 声明式事务管理
- 基于注解方式实现(常用)
- 基于xml配置文件方式
- 在Spring进行声明式事务管理,底层使用AOP原理
- Spring事务管理API
- 提供了一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
4|3事务操作(注解声明式事务管理)
-
在Spring配置文件配置事务管理器
-
在Spring配置文件中开启事务注解
-
在Spring配置文件中引入名称空间tx
-
开启事务注解
-
-
在service类上面添加事务注解
- 如果添加到类上面,则类中所有方法都添加事务
- 如果添加到方法上面,则只给此方法添加事务
4|4事务操作(声明式事务管理参数配置)
-
在service类上面添加@Transactional,在这个注解里可以配置事务相关的参数
-
propagation:事务传播行为
*多事务方法直接进行调用,这个过程中事务是如何进行管理的
-
isolation:事务隔离级别
默认值:@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
*事务有特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性会产生很多问题
*有三个读的问题:脏读、不可重复读、虚(幻)读
- 脏读:一个提交事务读取到了另一个未提交事务的数据
- 不可重复度:一个未提交事务读取到另一提交事务修改数据
- 虚读:一个未提交事务读取到另一提交事务添加****数据
解决:通过设置事务隔离级别就能解决读问题
-
timeout:超时时间
- 事务需要在一定时间内提交,如果不提交就会进行回滚
- 默认值:-1(不超时)
- 设置以秒为单位
-
readOlay:是否只读
- 读:查询操作;写:添加修改删除操作
- 默认值:false(表示可以读也可以写)
- 设置成true时只能读不能写
-
rollbackFor:回滚
- 设置出现哪些异常进行事务回滚
-
noRollbackFor:不回滚
- 设置出现哪些异常不进行事务回滚
-
4|5事务操作(xml声明式事务管理)
-
在Spring管理文件中进行配置
-
配置事务管理器
-
配置通知
-
配置切入点和切面
-
4|6事务操作(完全注解声明式注解管理)
创建配置类,使用配置类代替xml配置文件
5|0Spring5框架新功能
5|1整个Spring5框架基于java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除
5|2Spiring5框架自带了通用的日志框架
- Spring5已经移除了Log4jConfigListener,官方建议使用Log4j2
- Spring5框架整合Log4j2
Log4j2使用:
-
创建Log4j2.xml配置文件
5|3Spring5框架核心容器支持@Nullable注解
@Nullable注解可以使用在方法上面,属性上面,参数上面,表示方法返回可以为空,属性值可以为空,参数值可以为空
5|4Spring5核心容器支持函数风格GenericApplicationContext(lambda表达式)
5|5Spring5支持整合JUnit5
复合注解@SpringJUnitConfig(locations = "classpath:bean1.xml")
5|6SpringWebFlux
webflux介绍
-
基本概念
-
Spring5添加的新的模块,用于web开发的,功能与SpringMVC相似,webflux使用一种响应式编程出现的框架
-
使用传统的web框架,比如SpringMVC,这些基于Servlet容器,webflux是一种异步非阻塞的框架,异步非阻塞的框架在servlet3.1之后才支持,核心是基于Reactor的相关API实现的
-
-
响应式编程
-
webflux执行流程和核心API
-
Springwebflux(基于注解编程模型)
-
Springwebflux(基于函数式编程模型)
__EOF__

本文链接:https://www.cnblogs.com/YKHan/p/16202135.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)