Spring Framework系统架构
核心容器的学习
IOC/DI
IOC容器
IOC
使用对象时,由主动new产生的对象转换为由外部提供对象,此过程中对象的创建的控制权交由外部,此思想称为控制反转, (实现了自己new的解耦) 对象创建的控制权
Spring提供一个容器,称为IOC容器 用来充当IOC思想的外部
Bean
IOC容器负责对象创建,初始化,等一系列的操作,被创建或被管理的对象在IOC容器中统称为Bean
DI
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
核心概念 :
充分解耦 使用IOC管理bean 使用DI依赖注入进行绑定
最终效果 :使用对象时不仅可以从IOC中直接获取,并且获取到的Bean已经绑定了所有的依赖关系
IOC入门
管理什么---------------service与dao
如何将被管理的对象告知IOC容器 -------------配置
被管理的对象交由IOC容器,如何获取到IOC容器-----------接口
如何从容器中获取bean-----------接口方法
使用Spring获取到----------pom.xml
DI入门
如何将Dao对象进入到Service中 (提供set方法)
Servic与Dao的关系如何描述 (配置)
bean配置
单例模式,(默认) 多例
为什么用单例? scope si
不适合的给容器管理的bean封装实体的域对象
name可以配置多个名字
bean的实例化
实例化的三中的方式
1使用构造方法
调用的是无参的构造方法 构造方法的不管是公共的还是私有的都能调用,反射
技巧: Spring的报错观察最下面
2-----静态工厂的实例化
工厂的创建对象的方法是静态的 直接写到里面
配置上class = factory 然后后面添加工厂的方法的
为什么不直接new对象 原因可以在工厂中对 对象的功能的增强
3实例工厂初始化bean
工厂的创建bean的方法是非静态的 所以先要创建工厂对象,然后通过工厂对象创建bean
为什么创建一个无用的工厂bean累赘
改良--------- 使用FactoryBean实例化 <实用>
Bean的声明周期
从创建到销毁的整个过程
初始化容器,
创建对象
执行构造方法
执行属性注入set操作
执行bean的初始化方法
使用bean
执行业务操作
关闭销毁容器
执行bean的销毁
依赖注入的方式-----DI
注入的类型 ------------基本类型,引用类型
自动装配
IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程叫做自动装配
自动装配的方式
1 按照类型
2 按照名称
3 构造方法注入
4 不启动自动装配
在service要想自动装配dao要使用setter方法,然以配置中使用bytype
按照类型匹配必须要求类型唯一
按照名称装配 id和set方法后面的一致 要求名称必须一致 变量名与配置耦合,不推荐
自动装配用于引用类型的操作,不用于简单类型的进行操作,
自动装配的优先级低于setter方法和构造方法注入,同时出现会失效
数据源对象管理 第三方bean的管理
对象交由我们管理,将对应的属性提供过去,(set方法注入)
容器
1 ,加载类路径下的配置文件 -------------获取容器
2, 获取bean
BeanFactory接口最顶层的接口 最早期的容器接口
beanFactory的操作
两者的区别
beanfactory加载是延迟加载 application初始化的bean是立即加载的
注解
bean的作用范围 bean生命周期
单例加@scope prototype Singleton
bean的声明周期
初始化方法:-----(在构造方法之后运行) 在方法上加@PostConstruct
bean销毁之前------@PreDestroy
bean销毁之前的操作记得 关闭容器和关闭钩子才能运行
依赖注入----------自动装配
引用类型
@Autowired
原理按照类型装配
若是有多个相同类型的bean使用@Qualifier指定名称 (需要依赖@Aut 一起用)
注意:自动装配基于反射设计创建对象并暴力反射对应的私有属性初始化的数据,因此无需提供setter方法
自动装配记得提供无参的构造方法,(不提供造不出对象)
简单类型
@Value
加载外部的prop文件 配置的文件加载到bean中使用
1 写配置文件
2 配置文件上加注解 propertySource(文件地址) ----------不支持通配符*
3 使用
第三方bean的管理
@Bean 添加这个表示方法的返回值是bean
返回值就是所需要的bean
不建议直接 写入Springconfig中
新创建一个Config类然后导入SpringConfig配置中
如果配置类中缺少东西 如简单类型 引用类型
简单类型
Springconfig 配置文件上写 propertySource加载这个简单类型的数据文件地址 然后在用的地方直接@value
引用类型
假定需要使用dao 给个类型,Spring直接给你
原理自动装配 在容器中给你找这个bean给你自动装配进去 (按照类型装配)
注解和xml配置比较
注意 : bean定义完在再文件中,注解Component需要我们识别出来,扫描bean的包
Spring整合Mybatis
运行类
配置类
核心对象SqlSessionFactory
mybatis管理的就是sqsessionFactory对象
第三方bean的管理
记得Springconfig 导入该配置
创建sqlsessionFacoryBean
AOP
面向切面编程
不惊动原始设计的基础上为其进行功能的增强
无侵入式/无入侵式 编程
红色的是业务代码
将蓝色的代码抽取出来,
连接点 原始方法
切入点 实际追加功能的方法
通知 共性的功能
切面 通知这个共性的功能与切入点之间的关系 (在哪个切入点上执行那些通知)
连接点是所有方法,切入点是匹配某些方法,有了切入点有了通知将他们一绑定叫做切面
切面描述的就是共性功能与执行位置之间的关系
入门案例
AOP的工作流程
如果切入点和要造bean的那个类匹配上对应的方法,那么就造代理对象否则就是原始对象
工作本质:代理模式
Aop切入点表达式
描述切入点方法的表达式
execution执行到指定的切入点
通知类型
前置通知 @Before
设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行
后置通知 @After
设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法后运行
环绕通知
设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后运行
通过proceedingjoinpoint来调用原始方法,如果没有调用原始方法,就会对原始方法进行一个隔离的操作 比如说权限验证的操作,如果 没有权限,就不会调用原始方法,
返回后通知 @AfterReturning
设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法正常执行完毕后运行 (方法没有抛出异常才能通知)
抛出异常后通知 @AfterThrowing
注意,这个仅仅是方法出异常之后才能执行,不出异常不执行.
案例:测量业务层接口万次执行效率
这样就可以得到每个方法的执行时间,进行改良
主要是通过proceedingjoinpoint获取到该方法的签名信息,然后获取到该方法的接口名,和方法名
就可以描述出来当前测得是谁
注意只是一个理论值
AOP通知获取数据
获取参数
获取返回值
获取异常信息
分析:是不是所有的通知都能拿到这三个,但是返回值和异常信息不一定
获取参数
可以解决的问题,比如说前端传过来一个对象,但是我要的是字符串,那么aop获取到参数,检测到不是字符串,那么就传递一个默认的参数,这样就保证了程序的健壮性.
返回值的获取
afertreturning 和 around
案例百度网盘密码数据兼容处理
通过proceedingjoinpoint的getAregs获取到业务层代码的参数,然后获取到,密码的String,然后通过trim去掉密码的空格,然后返回到给业务层,然后继续实现业务层代码.
如果有许多大量的重复的功能在项目中加载,那么aop是不二选择,简化共性开发
Aop的总结
其中环绕通知可以模拟出其他所有的通知
只在调用方法前做事情-------前置通知
用trycatch在finally里面写的东西就是------后置通知
用trycach在try大括号结束之前原始方法调用之后的通知就是-------返回后通知
catch模拟--------抛出异常后通知
Spring的事务
解释:可以在业务层开启的事务
事务作用:在数据层保障一系列的数据库操作同成功同失败
Spring事务的作用: 在业务层开启事务可以保证多个调用数据层的操作同成功或者失败
如何保证 :平台事务管理器接口 两个方法 回滚,提交
实现类使用jdbc的事务
案例转账: 转账整个事务中没有原子性,要么这个转账的事务全做要么全不做
第一步在要加事物的接口上加上@Transaction 第二步设定平台事务管理器然后在配置中加上事务管理器,config中加上事务管理器的bean 创建事务的datasourceTransactionMananger事务管理器, 第三步 在Spring的配置文件中加上EnableTransactionManageMenagement告诉Spring你加上了Transaction这个事务管理器
当加上了事务的注解的业务层代码,出现了异常,要么都提交要么都不提交.
第一步
第二步
第三部
Spring事务角色
将两个事务都加到Spring事务中
事务管理员 事务发起方,在Spring中通常指的是业务层开启事物的方法
事务协调员 加入事务方 在Spring中指的是数据层的方法,也可以是业务层方法
将多个事务打成一个事务
mybatis中的sqlSessionFactory中的Datasource和我们的jdbc中的事务管理器中的sqlsessionFactory的datasource是同一个,所以Spring的事务管理才能生效进行统一进行管理
进行相同的数据源进行管理.
事务的相关配置(可以在注解上进行配置)
案例
日志事务和两个转账事务都继承一个事务,但是我们想要的是日志的事务不要加入这个事务的集中,自己开启一个全新事务
事务的传播行为 事务协调员对事务管理员的所携带事务的处理态度 (右边对左边)
让事务的协调员有不同的事务特征
SpringMVC
简介; 是一种基于Java实现的mvc模型的轻量级的web框架
Springmvc进行表现层功能开发
入门案例
导入jar包
定义成bean
初始化配置类
告诉tomcat容器加载配置
流程分析
Springboot