用法:<bean id="userService" class="com.test.spring.aop.UserService" p:userName="小王" p:userDao-ref="userDao"></bean>
先看源代码中所支持的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"/>
先看源代码所支持的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
作用: 扫描basePapkage包下的类含有 Component 注解,或者某个注解上含有Component的注解,典型的有Service,Contoller,Repository注解
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的过程,流程图如下: