Spring核心知识点吐血整理
2021-02-22 15:43:30 13 举报
AI智能生成
Spring知识点吐血整理
作者其他创作
大纲/内容
基本概念
Bean
被Spring管理的对象叫做Bean
Bean肯定是一个对象
对象不一定是Bean
BeanDefinition
BeanDefinition是用来描述一个Bean的,表示Bean的定义
beanClass
Bean对象的类型
scope
singleton
单例Bean
在Spring容器中,一个beanName只对应一个Bean对象
prototype
原型Bean
在Spring容器中,每次通过beanName获取的都是新的Bean对象
request
一个请求中,一个beanName只对应一个Bean对象
session
一个Session中,一个beanName只对应一个Bean对象
application
一个应用中,一个beanName只对应一个Bean对象
自定义作用域
可以自定义作用域
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的过程中会调用初始化方法
destroyMethodName
销毁方法
Spring在销毁Bean的过程中会调用销毁方法
constructorArgumentValues
构造方法参数值
可以通过BeanDefinition中的这个属性来给构造方法传递值
propertyValues
属性值
可以通过BeanDefinition中的这个属性来给Bean的某些属性赋值
factoryBeanName
一个Bean,可以通过另外一个Bean的某个方法来创建,这个属性就是指向另外那个Bean的beanName
factoryMethodName
一个Bean,可以通过另外一个Bean的某个方法来创建,这个属性就是另外那个Bean中的某个方法名字
BeanFactory
Bean工厂,可以根据某个bean的名字、或类型、或别名获取某个Bean对象
BeanDefinitionRegistry
可以注册、保存、移除、获取某个BeanDefinition
SingletonBeanRegistry
可以直接注册、获取某个单例Bean
ListableBeanFactory
在BeanFactory的基础上,增加了其他功能,可以获取所有BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类型获取{类型:对应的Bean}的映射关系
HierarchicalBeanFactory
在BeanFactory的基础上,添加了获取父BeanFactory的功能
ConfigurableBeanFactory
在HierarchicalBeanFactory和SingletonBeanRegistry的基础上,添加了设置父BeanFactory、类加载器(表示可以指定某个类加载器进行类的加载)、设置Spring EL表达式解析器(表示该BeanFactory可以解析EL表达式)、设置类型转化服务(表示该BeanFactory可以进行类型转化)、可以添加BeanPostProcessor(表示该BeanFactory支持Bean的后置处理器),可以合并BeanDefinition,可以销毁某个Bean等等功能
AutowireCapableBeanFactory
是直接继承了BeanFactory,在BeanFactory的基础上,支持在创建Bean的过程中能对Bean进行自动装配
AbstractBeanFactory
实现了ConfigurableBeanFactory接口,继承了FactoryBeanRegistrySupport,这个BeanFactory的功能已经很全面了,但是不能自动装配和获取beanNames
ConfigurableListableBeanFactory
继承了ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory
AbstractAutowireCapableBeanFactory
继承了AbstractBeanFactory,实现了AutowireCapableBeanFactory,拥有了自动装配的功能
DefaultListableBeanFactory
继承了AbstractAutowireCapableBeanFactory,实现了ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口,所以DefaultListableBeanFactory的功能很强大
ApplicationContext
ApplicationContext是个接口,可以把它理解为一个特殊的BeanFactory
继承了一些子接口
HierarchicalBeanFactory
拥有获取父BeanFactory的功能
ListableBeanFactory
拥有获取beanNames的功能
ResourcePatternResolver
资源加载器,可以一次性获取多个资源(文件资源等等)
EnvironmentCapable
可以获取运行时环境(没有设置运行时环境功能)
ApplicationEventPublisher
拥有广播事件的功能(没有添加事件监听器的功能)
MessageSource
拥有国际化功能
两个重要的实现类
AnnotationConfigApplicationContext
ConfigurableApplicationContext
继承了ApplicationContext接口,增加了,添加事件监听器、添加BeanFactoryPostProcessor、设置Environment,获取ConfigurableListableBeanFactory等功能
AbstractApplicationContext
实现了ConfigurableApplicationContext接口
GenericApplicationContext
AnnotationConfigRegistry
可以单独注册某个为类为BeanDefinition(可以处理该类上的@Configuration注解,已经可以处理@Bean注解),同时可以扫描
AnnotationConfigApplicationContext
继承了GenericApplicationContext,实现了AnnotationConfigRegistry接口,拥有了以上所有的功能
ClassPathXmlApplicationContext
它也是继承了AbstractApplicationContext,但是相对于AnnotationConfigApplicationContext而言,功能没有AnnotationConfigApplicationContext强大,比如不能注册BeanDefinition
继承了AbstractApplicationContext,实现了BeanDefinitionRegistry接口,拥有了所有ApplicationContext的功能,并且可以注册BeanDefinition,注意这个类中有一个属性(DefaultListableBeanFactory beanFactory)
BeanPostProcessor
Bean的后置处理器
Spring中提供的扩展机制,允许程序员可以干涉Bean的生命周期
本接口
初始化前
初始化后
子接口
InstantiationAwareBeanPostProcessor
在BeanPostProcessor的基础上增加了实例化前
在BeanPostProcessor的基础上增加了实例化后
在BeanPostProcessor的基础上增加了填充属性
DestructionAwareBeanPostProcessor
在BeanPostProcessor的基础上增加了销毁前
MergedBeanDefinitionPostProcessor
在BeanPostProcessor的基础上增加了实例化和实例化后之间
SmartInstantiationAwareBeanPostProcessor
在InstantiationAwareBeanPostProcessor的基础上增加了推断构造方法
在InstantiationAwareBeanPostProcessor的基础上增加了提前暴露引用
BeanFactoryPostProcessor
Bean工厂的后置处理器
Spring中提供的扩展机制,允许程序员可以操作BeanFactory
本接口
可以获取到BeanFactory,程序员可以操作BeanFactory
注意,不能注册BeanDefinition,只能修改BeanDefinition
子接口
BeanDefinitionRegistryPostProcessor
可以注册BeanDefinition
IOC
Bean的生命周期
Bean创建的生命周期
1. 生成BeanDefinition
2. 合并BeanDefinition
3. 加载类
4. 实例化前
5. 推断构造方法
6. 实例化
7. BeanDefinition的后置处理
8. 填充属性
9. 执行Aware
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
10. 初始化前
ApplicationContextAwareProcessor主要也是执行一些其他的Aware
EnvironmentAware
EmbeddedValueResolverAware
ResourceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware
InitDestroyAnnotationBeanPostProcessor
执行@PostConstruct定义的方法
11. 初始化
执行InitializingBean接口中的方法
执行BeanDefinition中所定义的初始化方法
12. 初始化后
AbstractAutoProxyCreator
AOP功能实现者
Bean销毁的生命周期
1. 容器关闭
2. 发布ContextClosedEvent事件
3. 调用LifecycleProcessor的onClose方法
4. 销毁单例Bean
1. 找出所有DisposableBean(实现了DisposableBean接口的Bean)
2. 遍历每个DisposableBean
3. 找出依赖了当前DisposableBean的其他Bean,将这些Bean从单例池中移除掉
4. 调用DisposableBean的destroy()方法
5. 找到当前DisposableBean所包含的inner beans,将这些Bean从单例池中移除掉
依赖注入
Spring中到底有几种依赖注入的方式?
手动注入
在XML中的<bean/>内对属性进行赋值
通过BeanDefinition的propertyValues进行赋值
对应的底层原理
set方法注入
构造方法注入
自动注入
XML的autowire自动注入
byType
byName
constructor
对应的底层原理
set方法注入
构造方法注入
@Autowired注解的自动注入
注入点
加了@Autowired注解的就是注入点
属性
普通方法
构造方法
循环依赖
什么是循环依赖?
A依赖B,B依赖A
三级缓存
singletonObjects
一级缓存,就是单例池
用来保存beanName所对应的完整的单例Bean对象
earlySingletonObjects
二级缓存
用来保存beanName所对应的不完整的单例Bean对象
不完整是指此时的Bean对象还没有走完全部的生命周期
二级缓存的作用是当某个Bean出现了循环依赖时,可以提前把这个不完整的Bean注入给其他Bean,从而打破循环依赖
二级缓存的内容是从三级缓存来的,执行ObjectFactory后得到的对象会放入三级缓存
singletonFactories
三级缓存
用来保存beanName对应的ObjectFactory,ObjectFactory是一个函数式接口,是一个lambda表达式
在创建一个单例bean时,只要Spring支持循环依赖,就会往三级缓存中存一个ObjectFactory对象
一旦这个bean出现了循环依赖,就会先从二级缓存中看是否能找到不完整的bean对象,如果二级缓存中不存在,则会从三级缓存中找到一个ObjectFactory并执行,然后将执行得到的结果放入二级缓存
ObjectFactory的作用是,如果当前这个Bean需要进行AOP,那么当出现了循环依赖时,就可以利用ObjectFactory来提前进行AOP
扩展点
@Import
普通类
可以将指定的多类注册为BeanDefinition
ImportSelect
可以将指定的多类注册为BeanDefinition
ImportBeanDefinitionRegistrar
可以注册BeanDefinition
BeanFactoryPostProcessor
针对BeanFactory的扩展点,可以操作BeanFactory
BeanDefinitionRegistryPostProcessor
针对BeanDefinitionRegistry的扩展点,可以注册BeanDefinition
BeanPostProcessor
上面整理了BeanPostProcessor相关的知识
FactoryBean
可以通过FactoryBean将程序员自定义的一个对象注册成为Spring中的一个Bean
FactoryBean是延迟加载的
SmartFactoryBean
和FactoryBean类似,但是可以控制要不要进行延迟加载
SmartInitializingSingleton
一个单例Bean经过了完整的生命周期后执行
AOP
JDK动态代理
被代理的对象定义要实现了某个接口
实现原理是,通过生成一个代理类,实现某个接口
InvocationHandler
代理逻辑
Cglib动态代理
通过ASM技术生成一个代理类去继承被代理类,被代理类为代理类的父类
ProxyFactory
对JDK动态代理和Cglib动态代理进行抽象
在Spring中,只需要通过ProxyFactory就可以生成代理对象,ProxyFactory的内部会根据类的信息和所设置的参数选者具体的代理机制
在Spring中,如果某个Bean需要进行AOP
如果Bean的类没有实现接口,则使用Cglib
如果Bean的类实现了接口,则使用JDK动态代理
可以设置proxyTargetClass为true,表示设置ProxyFactory尽量使用Cglib
事务
数据库事务
DataSource
getConnection()
Connection
setAutoCommit()
commit()
rollback()
隔离级别
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)
可重复读(REPEATABLE READ)
串行化(SERIALIZABLE)
传播机制
当前存在事务
PROPAGATION_NEVER
抛异常
PROPAGATION_NOT_SUPPORTED
把当前事务挂起,然后以非事务方式运行
PROPAGATION_REQUIRES_NEW
把当前事务挂起,然后新建一个事务
PROPAGATION_NESTED
记录一个SavePoint
其他情况
直接在当前事务中运行
当前不存在事务
PROPAGATION_MANDATORY
抛异常
PROPAGATION_REQUIRED
新建一个事务
PROPAGATION_REQUIRES_NEW
新建一个事务
PROPAGATION_NESTED
新建一个事务
其他情况
以非事务运行
0 条评论
下一页