Spring相关Bean记录
前言
统计记录下Spring相关Bean的类,以做记忆
Spring Bean解析与注册
BeanFactoryDefaultListableBeanFactoryXmlBeanFactoryXmlBeanDefinitionReaderBeanDefinitionHolderBeanDefinition
——AbstractBeanDefinition
————RootBeanDefinition
————ChildBeanDefinition
————GenericBeanDefinitionNamespaceHandlerFactoryBeanBeanPostProcessor
循环依赖————ObjectFactoryBeanWrapperAwareInitializingBeanDisposableBeanClassPathXmlApplicationContextAnnotationAwareAspectJAutoProxyCreatorInvocationHandler
Mybatis相关Bean
SqlSessionFactoryBeanMapperScannerConfigurerConfigurationSqlSessionExecutorStatementHandlerParameterHandlerResultSetHandlerTypeHandlerMappedStatementSqlSourceBoundSql
Spring事务相关Bean
TxNamespaceHandlerInfrasturctureAdvisorAutoProxyCreatorAnnotationTransactionAttributeSourceTransactionInterceptorBeanFactoryTransactionAttributeSourceAdvisorTransactionAttrubuteTransactionInfoTransactionStatus
事务传播规则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语句以及相应的参数信息

浙公网安备 33010602011771号