Spring基础知识
注:没有反射就没有框架,IOC (控制反转,即创建对象的过程由Spring做,不用自己new)底层就是反射
学习顺序
0. 反射
旨在完成:在不修改源码的情况下,通过外部程序配置来修改文件
eg. 给了re.properties,里面写着:
classfullpath=com.hsp.edu.Cat
method=hi
要求你new出一个对应对象并调用相应方法
通过string获取真正的class
1. IOC
把创建对象和对象之间的调用过程,交给spring
1.1 底层实现:xml解析+工厂模式+反射
由上可知,IOC本质上就是一个工厂
1.2 IOC容器
1.1节只是说明了IOC原理,本节介绍真正开发中如何使用封装后的IOC工厂模式,即IOC容器
IOC容器底层就是对象工厂
这两个接口有各种实现类
使用举例:
1.3 IOC操作Bean管理
Bean管理分为两个部分:Bean创建与属性注入
Bean管理有两种方式:基于XML的和基于注释的
1.3.1 IOC基于xml方式对Bean进行管理
(1)常规情况
(2)特殊值的处理:
(3)bean注入属性时,注入的属性是另一个对象(外部Bean)
(4)bean注入属性时,注入的属性是内部Bean和级联赋值
一对多关系:一个员工从属一个部门,一个部门内有多个员工,即员工类中有个部门类作为员工的属性
(类嵌套类,就涉及到对里层类的属性赋值)
内部Bean
级联赋值:
(5)xml注入集合属性
(6)单实例与多实例
Spring里面默认Bean是单实例对象,即在代码中反复取bean出来,发现对象编号是一样的
(7)Bean的生命周期
(8)自动注入属性
根据name自动装配
根据类型自动装配
在bean定义中找到相应对象
(9)将外部文件的内容作为属性值注入
外部文件内容:
xml文件修改部分:
修改部分的作用:
xmlns:context 是一个用于声明 Spring 的 context 命名空间的前缀,在声明了 context 命名空间后,可以使用 context:xxx 标签来配置与应用程序上下文和依赖注入相关的功能。
1.3.2 IOC基于注解方式对Bean进行管理
简化xml配置
AOP依赖、开启扫描
1.3.2.1 创建对象
四种注解创建对象:
(1)@Component:web层,确定不了事哪一个层的时候使用
(2)@Controller:控制层,就是我们的action层
(3)@Service:业务逻辑层,就是我们的service或者manager层
(4)@Repository:持久层,就是我们常说的dao层
XML文件:
具体类:
使用时先加载XML配置文件,读取到要求以注解方式管理bean:
注:组件扫描时也可设置哪些注释解析,哪些注释不解析
1.3.2.2 注入属性
三种注解可以实现属性注入:
(1)@Autowired:根据属性类型自动装配
(2)@Qualifier:根据名称自动装配
(3)@Resource:可根据类型可根据名称
上面三个都是注入对象属性
(4)@Value:为基本数据类型注入属性
纯注解开发,不需要xml配置文件
其实spring boot就是做到了这个
2. AOP
降低业务耦合度,开发方便
不通过修改源代码方式,在主干功能里面添加新功能
业务与业务之间隔离,各自开发。如需在主干业务上添加新业务,通过配置的方式结合二者即可
2.1 AOP 底层原理
对一个业务中的某个方法进行增强,在不修改源码的情况下新增业务
使用动态代理实现,有两种情况使用动态代理
(1)有接口 使用JDK动态代理
目标:为一个 接口实现类(UserDaoImpl) 创建代理对象
代码举例:
使用Proxy创建代理对象
方法中有三个参数:
- 类加载器
- 待增强方法所在的类,这个类实现的接口(可能是多个接口,所以是数组)
- 实现这个接口InvocationHandler,创建代理对象,写 增强的部分
前置准备:
创建代理对象UserDaoProxy:
调用:
(2)没有接口 使用CGLIB
2.2 术语
(1)连接点
(2)切入点
(3)通知(增强)
(4)切面 (把权限判断这个功能加入到用户登录业务中,这个过程叫切面)
2.3 具体实现
(1)AspectJ依赖
(2)切入点表达式:指明要对哪个类里的哪个方法做增强
2.3.1 注解实现
进行通知的配置
(1)创建配置文件
(2)利用注解创建对象
@Component
(3)在增强类上加注解@Aspect
(4)在配置文件中开启Aspect J
(5)设置增强类的位置
5种通知类型+切入点表达式
效果:
此时调用user add()方法,调用的是增强后的方法。
user Proxy单方面挂上user
注:重用切入点
一个方法有多个增强类,设置优先级@Order注解,值越小优先级越高
2.3.2 配置文件实现(了解)
切入点:被增强方法
切面:增强过程
3. JDBCTemplate
是Spring对JDBC的封装
关于Java中的JDBC,可参考此篇第四部分
先在配置文件中创建JDBCTemplate对象,然后再代码中引用这个对象
3.1增
调用JDBCTemplate中的update方法实现添加
BookDaoImpl设计(实现BookDao接口,一个跟数据库表完美对应的类):
实际调用通过Book Service:
3.2 删改
BookDaoImpl设计:
测试功能:
3.3 查
(1)查询返回单个值
通过Book Service调用测试:
(2)查询返回对象
eg.查询图书详情
依赖于这个函数:
BookDaoImpl:
Book Service:
(3)查询返回集合
eg.查询图书列表分页,set返回
依赖于这个函数:
BookDaoImpl:
Book Service:
3.4 批量增
核心方法:
BookDaoImpl:(返回影响行数)
Book Service:
3.5 批量改删
BookDaoImpl:
Book Service:
4. 事务
4.1 基本概念
4.2 基础功能实现
组件扫描引入注释
设置数据库连接池
Service里面注入DAO
DAO里面注入JDBC模板:
测试:
4.3 追加事务
4.3.1 配置文件(前置工作)
Spring中如何使用事务
配置文件:
开启事务注解:
增加命名空间且
在Service中增加事务注解
4.3.2 事务的参数(注解式管理)
(1)
(2)
(3)
4.3.3 XML管理事务
(1)配置文件
以上案例说明了事务的本质是AOP
4.3.4 完全注解开发
测试:
5. Spring5特性
整个框架基于Java8
5.1 JUnit
JUnit4
JUnit5
注释简化:
5.2 Webflux
基于Springboot,后续来补上
web开发模块
5.2.1 响应式编程
5.2.2 原理
5.2.3 基于注解式编程
5.2.4 基于函数式编程
6. 总结
-
Ioc 控制反转:new对象这一过程交给Spring的Ioc容器来完成,这个容器本质上是一个对象工厂,底层是通过反射实现的
-
DI 依赖注入:一个对象的创建包含另一个对象,即一个类的属性里有另一个类,这种嵌套方式就叫dependency injection
-
Ioc/DI 实现步骤:
(1)写配置文件
(2)创建Ioc容器,四种,ClassPathXmlApplicationContext等
(3)获取bean,然后使用你想要的方法 -
AOP面向切面编程:功能解耦,追加新功能。通过代理模式(23种设计模式之一)来实现:将非核心的代码交给代理(中介)做,然后代理去调用用户真正想要的核心代码。
-
两种代理:静态(对每个目标创建一个代理类)与动态(实际用,不用自己显式写,运行过程中动态生成)。动态代理有两种:JDK(要求目标类必须有接口,代理类和目标类实现同一个接口)和cglib(无需接口,直接根据目标类生成代理类)
-
声明式事务 spring-tx:通过注解或xml配置的方式来控制事务的提交和回滚,具体操作由框架干。