spring总结
2022-10-19 08:06:25 0 举报
AI智能生成
spring
作者其他创作
大纲/内容
day4AOP
什么是AOP?
面向切面编程,定义一个切面表达式,只要满足了这个表达式的方法,就可以对这些方法进行增强
场景
日志,方法运行时间,代码增强
实现原理
底层运用了动态代理,如果有接口或者实现了接口,就采用jDK动态代理,否则就采用cglib动态代理
JDK
实现invocationhandle接口,重写
CGLIB
day5 事务
spring事务的传播属性?
两个事务互相嵌套才用传播属性这一说法
支持当前事务
require
如果当前有事务,则加入事务,如果没有事务则创建新事务
support
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
不支持当前事务的
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
not_support
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
never
以非事务方式执行,如果当前存在事务,则抛出异常。
事务原理?
spring没有事务,都是生成指令到数据库里面,让数据库执行相关指令
ACID?
原子性
隔离性
持久性
一致性
隔离级别?
读未提交
读已替吉
可重复读
串行化
spring事务何时会失效?
spring事务失效主要是以下方面,一个数据库不支持事务,一个是不能生成动态代理或者生成动态代理缺使用的还是原来的对象,还有就是异常的捕获:
1. 非public方法 事务的实现原理是代理增强,非public不能进行代理增强,不能进行JDK或者CGLIB代理
2. 目标类为final修饰的类
3. 调用本类的方法
4. 抛出捕捉的非RuntimeException,如果想要捕捉所有异常(rollbackFor = {Exception.class})
5. 我们知道事务就是依赖于数据库的,所以数据库不支持肯定也是失效的!!比如myIsam
MVC启动流程
设计模式及地方
单例
默认
工厂
BeanFactory
代理
AOP
模板方法
Spring中jdbcTemplate、hibernateTemplate等以Template结尾的类,
它们就使用到模板模式
它们就使用到模板模式
适配器模式
在Spring MVC中,DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler,解析到对应的Handler(也就是我们常说的Controller控制器)后,开始由HandlerAdapter适配器处理。为什么要在Spring MVC中使用适配器模式?Spring MVC中的Controller种类众多不同类型的Controller通过不同的方法来对请求进行处理,有利于代码的维护拓展。
观察者
Spring事件流程总结:
定义一个事件: 实现一个继承自 ApplicationEvent,并且写相应的构造函数;
定义一个事件监听者:实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
使用事件发布者发布消息: 可以通过 ApplicationEventPublisher 的 publishEvent() 方法发布消息。
定义一个事件: 实现一个继承自 ApplicationEvent,并且写相应的构造函数;
定义一个事件监听者:实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
使用事件发布者发布消息: 可以通过 ApplicationEventPublisher 的 publishEvent() 方法发布消息。
委派
day1 注解
配置型注解
@Confgration
@Import
@Condition
赋值性注解
@Controller
@Service
@value
@Autowire
默认按类型注入
@Resource
默认按名称注入,
day2 ioc
什么是IOC?
控制反转,没有IOC之前创建对象是由我们控制的,有了之后将控制权交给IOC,
对象的实例化,赋值,初始化,销毁等一系列过程都由IOC进行管理。
对象的实例化,赋值,初始化,销毁等一系列过程都由IOC进行管理。
什麽是DI?
DI—Dependency Injection,即“依赖注入”,如person.setName(xxx)
注入方式
构造方法注入,setter注入,基于注解的注入
用到了那些技術?
存储对象,使用map结构来存储,在spring中一般存在三级缓存,最终都在一级缓存中,
singletonObjects存放完整的bean对象,
singletonObjects存放完整的bean对象,
流程:
web的情况,调用DispatcherServlet的init,初始化ApplicationContext
1,调用beanDefinitionReader对配置文件进行解析封装成BeanDefinition
2,调用doRegiestBeanDefinition(),将beanDefinition缓存
3,调用beanfactory就行对象实例化,默认实现就是DefaultListableBeanFactory
4,populatebean就行属性注入
5,调用BeanPostProcessor前置处理方法
6,调用init-mehtod方法
7,调用BeanPostProcessor后置处理方法
8,生成完整的bean对象,通过getBean方法可以直接获取
9,销毁,
bean的生命周期
1、实例化bean:反射的方式生成对象
2、填充bean的属性:populateBean(),循环依赖的问题(三级缓存)
3、调用aware接口相关的方法:invokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader对象的属性设置)
4、调用BeanPostProcessor中的前置处理方法:使用比较多的有(ApplicationContextPostProcessor,设置ApplicationContext,Environment,ResourceLoader,EmbeddValueResolver等对象)
5、调用initmethod方法:invokeInitmethod(),判断是否实现了initializingBean接口,如果有,调用afterPropertiesSet方法,没有就不调用
6、调用BeanPostProcessor的后置处理方法:spring的aop就是在此处实现的,AbstractAutoProxyCreator 注册Destuction相关的回调接口:钩子函数
7、获取到完整的对象,可以通过getBean的方式来进行对象的获取
8、销毁流程,1;判断是否实现了DispoableBean接口,2,调用destroyMethod方法
day3 循环依赖
什么是循环依赖?
什么情况下会发生?
什么情况下会发生?
属性注入的时候会发生循环依赖,Bean A 注入beanB,BeanB属性注入beanA,会形成一个依赖闭环,这个过程就叫循环依赖
流程?A与B循环依赖且有代理的情况下
1,getBean,doGetBean,createBean,doCreateBean,
2,getSingleton
3,从一级缓存中拿,第一次都为null
4,实例化
5,将创建A的代理对象的工厂放入三级缓存中(三级缓存的value为objectFactory)
6,属性注入B,发现B没有
去getBean(B)
实例化
将B的代理对象的工厂加入三级缓存
属性注入A
因为A的工厂已经存在于三级缓存,所以从三级缓存拿到A的代理,并放入到二级缓存中,并删除三级缓存中的A
将代理的A注入到原生的B中
初始化
生成代理的B
将代理的B放到一级缓存,删除创建标识,及二三级缓存
将代理的B注入到原生的A
初始化
将代理的A从二级缓存中取出来,将代理的A覆盖原生的A
0 条评论
下一页