Spring相关Bean记录
前言
统计记录下Spring相关Bean的类,以做记忆
Spring Bean解析与注册
BeanFactory
DefaultListableBeanFactory
XmlBeanFactory
XmlBeanDefinitionReader
BeanDefinitionHolder
BeanDefinition
——AbstractBeanDefinition
————RootBeanDefinition
————ChildBeanDefinition
————GenericBeanDefinition
NamespaceHandler
FactoryBean
BeanPostProcessor
循环依赖————ObjectFactory
BeanWrapper
Aware
InitializingBean
DisposableBean
ClassPathXmlApplicationContext
AnnotationAwareAspectJAutoProxyCreator
InvocationHandler
Mybatis相关Bean
SqlSessionFactoryBean
MapperScannerConfigurer
Configuration
SqlSession
Executor
StatementHandler
ParameterHandler
ResultSetHandler
TypeHandler
MappedStatement
SqlSource
BoundSql
Spring事务相关Bean
TxNamespaceHandler
InfrasturctureAdvisorAutoProxyCreator
AnnotationTransactionAttributeSource
TransactionInterceptor
BeanFactoryTransactionAttributeSourceAdvisor
TransactionAttrubute
TransactionInfo
TransactionStatus
事务传播规则SuspendedResourcesHolder
Spring Bean解析与注册
BeanFactory
工厂Bean,是一个接口,Spring中所有的Bean都是在通过BeanFactory中定义的类似于getBean的方法进行获取,该接口是Spring中的核心Bean。
DefaultListableBeanFactory
实现BeanFactory的抽象类,定义BeanFactory中通用逻辑。例如getBean重载的各种方法,都是在该抽象类中进行定义。
XmlBeanFactory
BeanFactory的一个实现类,主要用来处理以Xml方式配置Spring时,如何把Xml文件中所定义的Bean解析为Spring所能理解的实体。该类主要的逻辑就是来解析Xml 。
XmlBeanDefinitionReader
XmlBeanFactory就是用XmlBeanDefinitionReader来做Xml解析的。
BeanDefinitionHolder
解析出来的BeanDefinition所存放的地方,该类存放BeanDefinition之外,还存放了Bean的beanName和alias。
BeanDefinition
是一个接口,定义了Bean在Spring中的各种可执行的行为。
AbstractBeanDefinition
BeanDefinition的抽象类,主要用来存储Bean定义的各种信息,例如scope、initMethodName、destoryMethodName等等Xml中定义Bean的配置信息。
RootBeanDefinition ChildBeanDefinition GenericBeanDefinition
一般Bean在定义时,是定义为RootBeanDefinition,当某个Bean下挂有其他的Bean时,则会使用ChildBeanDefinition来定义子Bean,该子Bean的作用,是在某些属性在子Bean中未定义时,可以直接使用父Bean的定义。GenericBeanDefinition是在Spring2.5版本中新增的一种定义,该BeanDefinition通常用来注册用户可见的BeanDefinition,可见BeanDefinition意味着可以在该类上定义PostProcessor来对Bean进行操作。从Spring2.5版本之后,可以用GenericBeanDefinition来替代RootBeanDefinition和ChildBeanDefinition 。
NamespaceHandler
是一个接口,如果需要定义非Spring原生标签的,需要实现该接口,并同时定义DTD或者XSD来解析对应的标签。例如AopNamespaceHandler就是用来定义aop标签来实现NamespaceHandler接口的一个类。
FactoryBean
是一个接口,用于定义复杂的Bean而设计的一个接口。例如配置MyBatis时所需要配置的SqlSessionFactoryBean,由于在实例化该Bean时的逻辑过于复杂,通过Xml配置的方式来实现比较困难,所以Spring引入FactoryBean。在FactoryBean的具体实现类中,可以通过编码的方式,对Bean的实现进行改造。Spring在实例化Bean时,会去检测该类是否是FactoryBean,如果是,则会调用getObject()来获取真正需要实例化的Bean,而对应的FactoryBean都是为实例化getObject()中的Bean为做的准备工作。
BeanPostProcessor
是一个接口,用于定义Spring实例化之前与之后所需做的操作。Spring的Aop就是基于BeanPostProcessor来做的处理,Aop实现postProcessAfterInitialization(Object bean, String beanName)方法来返回代理的,具体逻辑后续介绍。
循环依赖 ObjectFactory
Spring的Bean在解析时,会去扫描当前类中是否需要依赖其他的Bean,如果需要依赖其他的Bean,则会首先解析所依赖的Bean。而这个依赖中间,就容易产生循环依赖的情况,例如beanA依赖beanB,beanB依赖beanC,beanC依赖beanA。而ObjectFactory就是为了解决循环依赖而产生的接口。在Spring的bean解析时,会出现以下2个解析情况:
第一种是通过属性加@Autowired注解或者在setter方法上加@Autowired注解;
第二种是在构造函数中依赖其他的bean;
第一种循环依赖的解决:当前Bean在解析时,如果遇到需要依赖其他bean的,则创建ObjectFactory类型的内部类,相当于把创建中的bean暴露出去,以供依赖传递。当该bean被依赖时,就提供ObjectFactory,以供被依赖,当循环依赖执行结束后,就再真正进行bean的解析操作。
第二种循环依赖的解决:无法解决,由于在构造函数中,需要当前bean在加载时,就要拿到对应bean的实例。因为在构造函数中,就可能根据依赖的bean进行进一步的操作,又无法使用ObjectFactory的方式进行解决。
BeanWrapper
Bean的创建包含2个步骤,分别是解析和实例化,解析即把bean定义的各种信息解读成Spring可识的实体,也就是BeanDefinition。而在实例化步骤,则是把bean真正加载到内存中,也就是实例化为BeanWrapper。就例如上面的循环依赖,由于并没有进行实例化,所以在解析阶段通过ObjectFactory来解决,具体的实例化在后续步骤中进行,把bean的信息实例化为BeanWrapper。bean的实例化是通过反射方式,调用构造函数执行的,所以根据xml配置信息来找到对应的构造函数,也是一项比较复杂的过程。
Aware
是一个接口,常见的实现类有ApplicationContextAware,当Spring实例化bean时,发现是Aware的实现类时,会根据该实现类是什么,把bean信息注入到对应方法中,这样能够让业务层的代码获取到Spring中比较底层的配置信息,例如ApplicationContextAware就可以让业务侧获取到applicationContext,然后根据applicationContext通过getBean重载的各种方法获取各种各样的bean。
InitializingBean
如果某个bean实现了该接口,则在该bean实例化之前调用afterPropertiesSet()方法,相当于xml配置文件中的init-method属性,只不过init-method属性可以指定具体执行的方法,而InitializingBean只能执行afterPropertiesSet()方法。而在执行顺序上,是首先执行afterPropertiesSet()方法,然后再执行init-method定义的方法。
DisposableBean
如果某个bean实现了该接口,则在该bean销毁时调用destory()方法,相当于配置文件中的destory-method属性,跟InitializingBean接口很相似。
ClassPathXmlApplicationContext
也是BeanFactory的实现类,包含了XMLBeanFactory的所有功能,并且额外扩展了很多功能,例如对@Qualifier和@Autowired注解的支持、注册拦截bean创建的处理器等等。
AnnotationAwareAspectJAutoProxyCreator
Spring Aop拦截启用所需创建的bean,该bean主要用来解析通过注解实现的Aop拦截,例如@AspectJ、@Pointcut等等,并解析对应的信息,以供后续使用。并且根据这些信息,对各个bean实例化时根据注解的信息判断该bean的各个方法是否需要创建代理。此时就要提及之前所说的BeanPostProcessor接口了,AnnotationAwareAspectJAutoProxyCreator的父类具体具体实现了BeanPostProcessor接口中postProcessorAfterInitialization方法,在该方法中,会根据Aop注解的信息判断各个Bean是否需要创建代理,如果需要创建代理,则bean实例化返回的其实就是代理。
InvocationHandler
动态代理的关键接口,是jdk提供的接口,该接口的实现类中,需要提供需要代理的目标对象,然后在invoke方法中,通过反射的方式调用目标对象的实际处理方法,在实际处理方法的前后,可以调用Aop封装的切面方法。该接口的关键是必须是面向接口编程的。如果对实体类进行Aop操作,则是通过CGLIB实现的,具体方法不解释了。
Mybatis相关Bean
SqlSessionFactoryBean
是FactoryBean的实现类,用于配置Mybatis,主要是为了生成Configuration
MapperScannerConfigurer
配置包路径,用于扫描包下的mapper文件,并解析成Spring可识的bean文件,并根据mapper中的namespace来找到对应的接口进行关联,以便后续的注入
Configuration
Mybatis的配置类,这里面封装了所有Mybatis配置时的信息,例如配置的插件(分页插件)等
SqlSession
与数据库打交道的接口类,定义了基本的查询方法,在SqlSessionFactoryBean中,会给SqlSession生成一个默认的实现,也就是DefaultSqlSession。
Executor
SQL执行,负责SQL语句的生成和查询,同时也维护着Mybatis的一级缓存信息。
StatementHandler
封装jdbc的Statement信息和操作,通过调用ResultSetHandler把ResultSet结果集封装成List集合
ParameterHandler
参数映射解析,负责把用户传入的参数转换为数据库所需要使用的类型,例如java.util.Date转为java.sql.Date类型
ResultSetHandler
结果处理和映射,负责把jdbc返回的ResultSet封装成List类型的集合
TypeHandler
负责把Java数据类型转换为jdbc的数据类型,
MappedStatement
维护着mapper中各个select|update|delete|insert节点的封装
SqlSource
SQL解析,负责根据用户传入的实体,动态地生成SQL语句,将信息封装到BoundSql中
BoundSql
表示动态生成的SQL语句以及相应的参数信息