spring beanFactory系列(一)

1 资源加载器


  1. Resource 所有资源的表现形式,包含File,Classpath,Url,Jar等
  2. ResourceLoader 加载Resource的工具,通过资源前缀区分,返回不同的Resource
  3. ResourcePattenResolver 用来加载Classpath* 目录下的,即所有JAR包下的文件,支持Ant通配符

2 从xml到Document


  1. EntityResolver 作用:用于获取XML的校验文件,如:dtd,xsd文件
  2. PluggableSchemaResolver 作用:获取xsd格式的校验文件,读取 META-INFI 目录下的 spring.schemas 文件
  3. DocumentLoader 作用: 解析xml资源文件,输出document
  4. BeanDefinitionDocumentReader  作用:将document 解析成 BeanDefinition 类

3  document解析成BeanDefinition


  1. NamespaceHandlerResolver 作用:  读取 META-INF 目录下的spring.handlers 文件,解析成 NamespaceHandler 类
  2. NamespaceHandler 作用: 解析自定义Bean,装饰Bean
  3. BeanDefinitionParse 作用: 有些NamespaceHandler 可能需要根据不同的属性作不同的解析
  4. BeanDefinitionDecorator 作用: 有些NamespaceHandler 可能需要根据不同的属性作不同的装饰
  5. 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的过程,流程图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值