sping

spring IOC的理解

1.控制反转: 原来的对象是由使用者进行控制,spring帮我们管理整个对象
2.DI: 依赖注入,把对应的属性的值注入到对象中,@autowired, populateBean完成属性值的注入
3.容器: 存储对象的,使用map结构来存储,在spring中一般存在三级缓存,singletonObject存放完整的bean对象,整个bean的生命周期,从创建到销毁的过程都是由容器来管理

分:
1.ioc容器,涉及到容器的创建过程(BeanFactory,DefaultListableBeanFactory),向beanFactory设置参数,(BeanPostProcessor,Aware接口的子类)
2.加载解析bean对象,准备创建的bean对象的定义信息,beanDefiniton(xml或者注解解析)
3.beanFacoryPostProcessor的处理,此处是扩展点,PlaceHolder ConfigurSuppor,ConfigurationClassPostPrecessor
4.BeanPostProcess的注册功能,方便后续对bean对象完成具体的扩展功能
5.通过反射的方式,将BeanDefinition对象实例化成具体的bean对象
6.bean对象的初始化过程(填充属性,调用aware子类方法,调用BeanPostProcessor前置处理方法,调用init-method方法,调用BeanPostProcessor的后置处理方法)
7.生成完整的bean对象,通过getbean方法可以直接获取
8.销毁过程
具体细节我记不太清了,但是spring中的bean都是通过反射的方式生成的,同时包含了很多的扩展点,比如最常用的对beanFactory的扩展,对bean的扩展(对占位符的处理),我们在公司这方面使用比较多,除此之外,ioc中最核心的就是填充具体的bean的属性,和生命周期

spring IOC底层实现

1.先通过createBeanFactory创建一个Bean工厂(DefaultListableBeanFactory)
2.开始循环创建对象,因为容器中的bean默认都是单例的,使用优先通过getBean,doGetBean从容器中查找
3.找不到的话,通过createBean,doCreateBean方法,以反射的方式创建对象,一般情况下是使用的是无参构造(getDeclaredConstructor,newInstance)
4.进行对象的属性填充,populateBean
5进行其他的初始化操作(initializingBean)

bean的生命周期

在这里插入图片描述

spring 循环依赖

三级缓存,提前暴露对象,aop
先说明bean的创建过程:实例化,初始化(填充属性)
1.先创建A对象,实例化A对象,此时A对象中的b属性为空,填充属性b
2.从容器中查找B对象,找不到会直接创建B对象
3.实例化B对象,此时对象中的a属性为空,填充属性a

Bean Factory 和FactoryBean有什么区别

相同点:都是用来创建bean对象
不同点:使用BeanFactory创建对象的时候,必须要遵循严格的生命周期流程,很复杂
如果想简单的自定义某个对象的创建,同时创建完成的对象想交给spring来管理,那么就需要实现FactoryBean接口
isSingleton 是否是单例对象
getObjectType:获取返回对象的类型
getObject:自定义对象的过程(new/反射/动态代理)

spring中的设计模式

1.单例模式:bean默认都是单例的
3.工厂模式:beanFactory
7.适配器模式: 通知的时候有Adapter,AdvisorAdapter
10.代理模式:使用cglib,jdk进行动态代理

2.原型模式: 可以通过作用域的方法来改变bean为prototype
4.模板方法模式:postProcessBeanFactory , onRefresh, initPropertyValue
5.策略模式:XmlBeanDefinitionReader, PropertiesBeanDefinitionReader
6.观察者模式:监听器listener, 监听事件event, 广播器multicast
8.装饰者模式:BeanWrapper
9.责任链模式:使用aop进行通知调用的时候会先生成一个拦截器链
11.委托者模式:delegate

spring的AOP实现原理

aop是ioc的整个流程中的一个扩展功能,BeanPostProcessor
总:aop概念,应用场景,动态代理
分:bean的创建过程中有一个步骤可以对bean进行扩展实现,在BeanPostProcessor的后置处理方法中进行实现
1.代理对象的创建过程(advice,切面,切点)
2.通过jdk或者cglib的方式生成代理对象
3.在执行方法调用的时候,会调用到生成的字节码文件中,直接会找到DynamicAdvisoredInterceptor类中的interceptor 方法,从此方法开始执行
4.根据之前定义好的通知来生成拦截器链
5.从拦截器链中依此获取每一个通知开始进行执行

spring 的事务管理是如何实现的?

总: 声明式事务,由aop实现的,首先生成具体的代理对象,正常情况下要通过通知来完成核心功能,但是spring事务是通过TransactionInterceptor中的invoke方法来实现具体的逻辑
分: 1.解析各个方法上事务相关的属性,根据具体的属性判断是否开启新事务
2.需要开启事务的时候,获取数据库连接,关闭自动提交功能,开启事务
3. 执行具体的sql
4. 执行失败,通过completeTransactionAfterThrowing 来完成回滚操作,具体逻辑通过doRollBack方法实现,先获取连接对象,通过连接对象来回滚
5. 执行成功,通过commitTransactionAfterReturning来完成事务的提交,具体逻辑通过doCommit方法实现,先获取连接对象,通过连接对象来提交
6. 事务执行完毕,清除相关的事务信息,cleanupTransactionInfo

spring事务传播

七种事务传播特性
Required,Requires_new,nested,Support,Not_Support,Never,Mandatory
某一个事务嵌套另一个事务的时候怎么办?
A方法调用B方法,AB都有事务,并且传播特性不同,那么A如果有异常,B怎么办,B如果有异常,A怎么办
总:事务的传播特性是指不同的方法嵌套调用的过程中,事务应该如何处理,是同一事务还是不同事务,当出现异常的时候回回滚还是提交,连个方法之间的相关影响,在工作中,使用多的是required,Requires_new,nested
分: 1. 事务可以分为三类,支持当前事务,不支持当前事务,嵌套事务
2.如果外层方法是required,内层是required,requires_new,nested
3.如果外层方法是requires_new,内层是required,requires_new,nested
4.如果外层方法是nested,内层是required,requires_new,nested

	  处理逻辑:
	  	1.判断内外方法是否是同一个事务:
	  			是:异常统一在外层方法处理
	  			否:内层方法有可能影响到外层方法,但是外层方法是不会影响内层方法的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值