Spring总结(AOP-IOC-事务-动态代理-Bean线程)


一、BeanFactory 的实现过程

1、加载所有的 Bean 配置成 BeanDefinition(包括Bean属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等) 到Map中,如果 Bean 有依赖关系,则使用占位符暂时代替。
2、调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化,同时,如果有依赖关系,将递归调用 getBean 方法 —— 完成依赖注入。
3、底层的核心是反射机制,他会通过反射的技术,直接根据你的类去自己构建对应的对象出来。

二、IOC工厂设计模式

IOC 最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入 。
Spring有两个容器:
1、BeanFactory 粗暴简单,可以理解为就是个 HashMap
2、ApplicationContext 相比BeanFactory 要高级一些,包含了BeanFactory 的所有功能,他依赖着 BeanFactory 的 getBean 功能

三、AOP

AOP是Spring框架面向切面的编程思想,Spring事务就是一个完美的体现。开发的时候都会写Sevice类,在这些类的所有方法中,在刚开始运行的时候,都被织入一些代码,通过Aspect先去开启一个事务,在所有这些方法运行完毕之后,去根据是否抛出异常来判断一下,如果抛出异常,就回滚事务,如果没有异常,就提交事务 。

四、Spring事务

事务的实现原理,事务传播机制,如果说你加了一个@Transactional注解,此时就spring会使用AOP思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你方法是否报错,来决定回滚还是提交事务。

事务传播机制
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,
该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,
就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,
就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,
则按REQUIRED属性执行。

事务常见面试题
1)方法A调用方法B,我希望的是如果说方法A出错了,此时仅仅回滚方法A,不能回滚方法B,
	必须得用REQUIRES_NEW,传播机制,让他们俩的事务是不同的
2)方法A调用方法B,如果出错,方法B只能回滚他自己,方法A可以带着方法B一起回滚,NESTED嵌套事务

五、jdk动态代理和cglib动态代理区别。

优先是jdk动态代理,其次是cglib动态代理。
1)其实就是动态的创建一个代理类出来,创建这个代理类的实例对象,在这个里面引用你真正自己写的类,所有的方法的调用,都是先走代理类的对象,他负责做一些代码上的增强,再去调用你写的那个类

2)spring里使用aop,比如说你对一批类和他们的方法做了一个切面,定义好了要在这些类的方法里增强的代码,spring必然要对那些类生成动态代理,在动态代理中去执行你定义的一些增强代码

3)如果你的类是实现了某个接口的,spring aop会使用jdk动态代理,生成一个跟你实现同样接口的一个代理类,构造一个实例对象出来,jdk动态代理,他其实是在你的类有接口的时候,就会来使用

4)很多时候我们可能某个类是没有实现接口的,spring aop会改用cglib来生成动态代理,他是生成你的类的一个子类,他可以动态生成字节码,覆盖你的一些方法,在方法里加入增强的代码

六、Spring Bean不是线程安全。

spring bean默认来说,singleton,都是线程不安全的,java web系统,一般来说很少在spring bean里放一些实例变量,一般来说他们都是多个组件互相调用,最终去访问数据库的

Spring容器中的bean可以分为5个范围:
一般来说下面几种作用域,在开发的时候一般都不会用,99.99%的时候都是用singleton单例作用域 其次是prototype
1)singleton:默认,每个容器中只有一个bean的实例
2)prototype:为每一个bean请求提供一个实例

3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效
5)global-session

七、spring bean生命周期

从创建 -> 使用 -> 销毁 创建+初始化一个bean -> spring容器管理的bean长期存活 -> 销毁bean(两个回调函数)
(1)实例化Bean:如果要使用一个bean的话

(2)设置对象属性(依赖注入):他需要去看看,你的这个bean依赖了谁,把你依赖的bean也创建出来,给你进行一个注入,比如说通过构造函数,setter

(3)处理Aware接口:
如果这个Bean已经实现了ApplicationContextAware接口,spring容器就会调用我们的bean的setApplicationContext(ApplicationContext)方法,传入Spring上下文,把spring容器给传递给这个bean

(4)BeanPostProcessor:
如果我们想在bean实例构建好了之后,此时在这个时间带你,我们想要对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。

(5)InitializingBean 与 init-method:
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。

(6)如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法

(7)DisposableBean:
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

(8)destroy-method:
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值