1 资源加载器
Resource 所有资源的表现形式,包含File,Classpath,Url,Jar等
ResourceLoader 加载Resource的工具,通过资源前缀区分,返回不同的Resource
- ResourcePattenResolver 用来加载Classpath* 目录下的,即所有JAR包下的文件,支持Ant通配符
2 从xml到Document
EntityResolver 作用:用于获取XML的校验文件,如:dtd,xsd文件
PluggableSchemaResolver 作用:获取xsd格式的校验文件,读取 META-INFI 目录下的 spring.schemas 文件
DocumentLoader 作用: 解析xml资源文件,输出document
BeanDefinitionDocumentReader 作用:将document 解析成 BeanDefinition 类
3 document解析成BeanDefinition
NamespaceHandlerResolver 作用: 读取 META-INF 目录下的spring.handlers 文件,解析成 NamespaceHandler 类
NamespaceHandler 作用: 解析自定义Bean,装饰Bean
BeanDefinitionParse 作用: 有些NamespaceHandler 可能需要根据不同的属性作不同的解析
BeanDefinitionDecorator 作用: 有些NamespaceHandler 可能需要根据不同的属性作不同的装饰
- BeanDefinitionParseDelegate 作用: 负责解析Bean节点,如果是其它节点调用NamespaceHandler进行解析,解析完后,如果Bean上有自定义的属性,例如p:c=a等,需要调用NamespaceHanler进行装饰,如果Bean节点有自定义的子节点,例如:<aop />,需要调用NamespaceHandler进行装饰。
请看AopNamespaceHandler 类;
4 spring Xml中,Bean工程和Context工程下支持的自定义标签与属性
1 http\://www.springframework.org/schema/p
用法:<bean id="userService" class="com.test.spring.aop.UserService" p:userName="小王" p:userDao-ref="userDao"></bean>
2 http\://www.springframework.org/schema/util
先看源代码中所支持的BeanDefinition 解析器
contant 用法: <util:constant id="hwConstant" static-field="test.HelloWorld.hwStatic"/>
property-path 用法: <util:property-path id="hello" path="helloWorld.hello"/>
<bean id="helloWorld" class="test.HelloWorld">
<property name="hello" value="hi"/>
</bean>
list 用法: <util:list id="listUtil" list-class="java.util.ArrayList">
<value>first</valuse>
<value>two</valuse>
</util:list>
set 用法: <util:set id="setUtil" set-class="java.util.HashSet">
<value>first</value>
<value>two</value>
</util:set>
map 用法: <util:map id="mapUtil" map-class="java.util.HashMap">
<entry key="1" value="first">
<entry key="2" value="two">
</util:map>
properties 用法: <util:properties id="xxx" location="classpath:xxxxx.properties" ignoreResourceNotFound="true"/>
3 http\://www.springframework.org/schema/context
先看源代码所支持的BeandefinitionParse解析器
property-placeholder 用法: <context:property-placeholder properties-ref="xxx" file-encoding="utf-8" ignoreResourceNotFound="true" trim-values="true"/>
作用:用作bean的后置处理器,对Bean中的属性,className中变量进行替换,如${XXX}
property-override 用法: <context:property-override location="classpath:aaa.properties" ignore-unresolvable="true" />
作用:后置处理器:可以替换Bean中已存在的属性
annotation-config 用法: <context:annotation-config />
作用: 设置BeanFactory 中的 DependencyComparator,采用AnnotationAwareOrderComparator(注解比较器@Order,@Priority)
设置BeanFactory中的 AutowireCandidateResolver,采用ContextAnnotationAutowireCandidateResolver,用来解析@Lazy, 父类 QualifierAnnotationAutowireCandidateResolver 用来解析
@Qualifier,@Value
注入 ConfigurationClassPostProcessor 处理器, 处理@PropertySource标签,用来解析属性文件并设置到Environment中。
处理@ComponentScan标签,扫描package下的所有Class并进行迭代解析。
处理@ImportResource标签。
处理@Bean标签。处理所有继承的Interface上的@Bean标签。处理SuperClass
处理@Import标签。Import支持注解继承,处理ImportSelector,延后处理 DeferredImportSelector
注入 AutowiredAnnotationBeanPostProcessor 处理器,处理@Autowire,@Value标签 @lookup-method标签
注入 RequiredAnnotationBeanPostProcessor 处理器,处理@Required标签
注入 CommonAnnotationBeanPostProcessor处理器,处理@PostConstruct,@PreDestroy,@Resource标签
注入 EventListenerMethodProcessor处理器,处理@EventListener 标签,主要逻辑如下:
1 获取所有的EventListenerFactory 类型的Bean
2 获取所有的Bean,判断Bean的方法上是否有EventListener 注解,有的话根据看EventListenerFactory是否支持该方法,支持的话就创建一个ApplicationListener,并添加到
ApplicationContext中。
注入 DefaultEventListenerFactory
component-scan 用法: <context:component-scan base-package="xxx.xxx.xxx" resource-pattern="**/*.class" use-default-filters="true" />
作用: 扫描basePapkage包下的类含有 Component 注解,或者某个注解上含有Component的注解,典型的有Service,Contoller,Repository注解
5 BeanDefinition 族
GenericBeanDefinition:表示XML中的Bean
6 DefaultListableBeanFactory
1 先看DefaultListableBeanFactory 类图
2 BeanDefinitionRegistry 已经包了所有的BeanDefinition,剩下的就是生成Bean,Bean的生成由调用的过程中进行生成。
3 SingleBeanRegistry 实现类DefaultSingleBeanRegistry, 主要是获取单例Bean,以及从ObjectFactory中生成单例Bean。
4 FactoryBeanRegistrySupport, 从FactoryBean中获取Bean,如果是单例模式,将Bean缓存在factoryBeanObjectCache中。
5 ConfigurableBeanFactory, 主要设置BeanExpressResolver,ConversionService,PropertyEditorRegistrar,TypeConverter,StringValueResolver,添加CustomEditor,
添加Bean的后置处理器 BeanPostProcessor
6 AbtractBeanFactory, 主要功能: 获取Bean,以及生成Bean, 先获取单例Bean,再获取原型Bean,最后从Scope中获取Bean,Scope可以自定义,具体实现可以参考DefaultSingleBeanRegistry。
AbstracBeanFactory中有个很重要的类SimpleTypeConverter,spring中的属性转成具体所需要类型,全靠这个类进行转换,这个类已经包含了ConversionService,CustomEditor,
PropertyEditorRegistrar所转换方法,具体转换代码在 TypeConverterDelegate 类中,该类需要TypeConverter进行构造
7 AutowireCapableBeanFactory,主要功能,解决Bean的依赖,创建Bean,组装Bean,以及对Bean的前置,后置,属性进行处理
8 AbstractAutowireCapableBeanFactory 创建Bean的过程,流程图如下: