spring核心知识点
2021-06-11 11:32:33 28 举报
AI智能生成
spring核心知识点,对spring知识总结
作者其他创作
大纲/内容
AOP
JDK动态代理
被代理的对象定义要实现了某个接口
实现原理是,通过生成一个代理类,实现某个接口
代理逻辑
InvocationHandler
cglib代理
通过ASM技术生成一个代理类去继承被代理类,被代理类为代理类的父类
ProxyFactory
对JDK动态代理和Cglib动态代理进行抽象
ProxyFactory就可以生成代理对象,ProxyFactory的内部会根据类的信息和所设置的参数选者具体的代理机制
在Spring中,如果某个Bean需要进行AOP
如果Bean的类没有实现接口,则使用Cglib
如果Bean的类实现了接口,则使用JDK动态代理
可以设置ProxyTargetClass为ture,表示设置ProxyFactory尽量使用Cglib
事务
数据库事务
DataSource
getConnnection()
Connection
setAutoConmmit()
commit()
rollback()
隔离级别
读未提交(READ UNCOMMITED)
读已提交(READ COMMITED)
可重复读(REPEATABLE READ)
串行化(SERIALZABLE)
事务传播机制
当前存在的事务
PROPAGATION_NEVER
抛异常
PROPAGATION_NO_SUPPORTED
PROPAGATION_REQUIRES_NEW
把当前事务挂起,然后新建一个事务
PROPAGATION_NESTED
记录一个SavePoint
其它情况
直接在当前事务中运行
当前不存在的事务
PROPAGATION_MANDATORY
PROPAGATION_REQUIRED
新建一个是事务
以非事务运行
spring核心知识点
基本概念
Bean
被Spring管理的对象叫Bean
对象不一定是bean
Bean肯定是一个对象
BeanDefinition
BeanDefiniton是用来描述一个bean的,表示bean的定义
beanClass
bean对象类型
scope
singleon
单例Bean
在spring容器中,一个beanName只对应一个Bean对象
prototype
原型Bean
在springring容器中,每次通过beanName获取都是新的bean对象
request
一个请求中,一个beanName只对应一个Bean对象
session
一个Session中,一个beanName只对应一个Bean对象
application
可以自定义作用域
isLazy
是不是一个懒加载的bean
原型懒加载的bean
没有意义
单例懒加载的bean
非懒加载的单例Bean是在Spring启动时时候记载的
懒加载的单例bean不是在Spring启动的时候创建的,而是在第一次获取bean的创建的
@Lazy
dependsOn
表示依赖的其他Bean
@DependsOn
指定所依赖的Bean的名字
autowire
自动装配模式
constructor
通过类中的构造方法进行装配
涉及到构造方法推断
byType
通过set方法的参数类型进行自动装配
byName
通过类中的set方法的名字进行自动装配
no
不进行自动装配
Spring中默认值就是no
注意和autowired注解的区别
autowireCandidate
当前bean是不是自动装配的候选者
表示当前bean能不能自动注入给其他bean,默认为true,如果为false,表示当前这个Bean不能自动注入给其他Bean
primary
主Bean
在进行自动注入时,通过属性类型或方法参数类型可能会找到多个Bean,那么这么多个bean中存在一个主Bean,那么就直接把这个主bean注入给属性或方法,如果存在多个主Bean,则会报错
initMethodName
初始化方法
spring在bean创建过程中会调用bean初始化的方法
destroyMethodName
销毁方法
Spring在销毁Bean的过程中会调用销毁方法
constructorArgumentValues
构造方法参数值
可以通过BeanDefinition中的这个属性来给Bean的某些属性赋值
propertyValues
属性值
factoryBeanName
一个Bean,可以通过另外一个Bean的某些方法来创建,这个属性就是指向另外那个Bean的beanName
factoryMethodName
一个Bean,可以通过另外一个Bean的某个方法来创建,这个属性就是另外那个Bean中的某个方法名字
IOC
Bean创建的生命周期
生成BeanDefinition
合并BeanDefinition
加载类
实例化前
推断构造方法
实例化
BeanDefinition的后置处理
填充属性
执行Aware
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
初始化前
ApplicationContextAwareProcessor主要也是执行一些其他的Aware
EnvironmentAware
EmbedValueResolverAware
ResourceLoaderAware
ApplicationEventPublisherAware
MeassageSourceAware
ApplicationContextAware
初始化
执行InitializingBean接口中的方法
执行BeanDefinition中所定义的初始化方法
初始化后
AbstractAutoProxyCreator
AOP的实现者
Bean销毁的生命周期
容器关闭
发布ContextClosedEvent事件
调用LifecycleProcessor的onClose方法
销毁单例Bean
找出所有DisposableBean(实现了DisposableBean接口的Bean)
遍历每个DisposableBean
找出依赖了当前DisposableBean的其他Bean,将这些Bean从单例池中移除掉
调用DisposableBean的destroy()方法
调用DisposableBean所包含的inner beans,将这些Bean从单例池中移除掉
依赖注入
Spring中到底有几种依赖的方式?
手动注入
在XML中的<bean/>内对属性进行赋值
通过BeanDefinition的propertyValues进行赋值
对应的底层原理
set方法注入
构造方法注入
自动注入
XML的autowire自动注入
@Autowired注解的自动注入
注入点
增加了@Autowired注解的就是注入点
属性
普通方法
构造方法
循环依赖
什么是循环依赖
A依赖B,B依赖A
spring解决方案
singletonObjects
一级缓存,就是单例池
用来保存beanName所对应的完整的单例Bean对象
earlySingletonObjects
二级缓存
用来保存beanName所对应的不完整的单列Bean对象
不完整是指此时的Bean对象还没有走完全部的生命周期
二级缓存的作用是当某个Bean出现了循环依赖时,可以提前把这个不完整的bean注入给其他Bean,从而打破依赖注入
二级缓存的内容是从三级缓存来的,执行ObjectFactory后得到的对象会放入三级缓存
singletonFactories
三级缓存
用来保存beanName对应的ObjectFactory,ObjectFactory是一个函数式接口,是一个lamda表达式
在创建一个单例Bean时,只要Spring支持循环依赖,就会往三级缓存中存一个ObjectFactory对象
一旦这个bean出现循环依赖,就会先从二级缓存中看是否找到不完整的bean对象,如果二级缓存中不存在,则会从三级缓存中找到一个ObjectFactory并执行,然后将得到的结果放入二级缓存
ObjectFactory的作用是,如果当前这个Bean需要进行AOP,那么当前出现了循环依赖时。就可以利用ObjectFactory来提前进行AOP
扩展点
@import
可以将制定的多类注册为BeanDefinition
ImportSelect
可以将指定的多类注册为BeanDefinition
ImportBeanDefinitionResgister
可以注册BeanDefinition
BeanFactoryPostProcessor
对BeanFactory的扩展点,可以操作BeanFactory
BeanDefinitionResgistryPostProcessor
针对BeanDefinitionResgistry的扩展点,可以注册BeanDefinition
BeanPostProcessor
可以对实例化后的bean进行扩展
FactoryBean
可以通过FactoryBean将程序员定义的一个对象注册成为Spring中的一个Bean
FactoryBean是延迟加载的
SmartFactoryBean
和FactoryBean类似,但是可以控制要不要进行延迟加载
SmartInitialingSingleton
一个单例Bean经过了完整的生命周期后执行
0 条评论
回复 删除
下一页