Spring@Component和@Autowired注解解析本⽂基于ClassPathXmlApplicationContext。
在《Spring IoC容器的解析》⼀⽂中我们知道Bean的定义以及Bean与Bean之间的依赖关系是配置在Spring配置⽂件中的,这样会引发⼀个问题,就是Bean很多,依赖关系复杂的话,会导致Spring配置⽂件⼗分庞⼤,不利于维护。 那有什么办法能解决这个问题呢?就是本⽂要讲的两个注解@Component和@Autowired。
为了能让@Component和@Autowired注解起效,我们需要在Spring配置⽂件中进⾏如下配置:
1、@Component
@Component的作⽤是把类定义成⼀个Bean。
接下来我们具体分析下添加@Component注解的类定义成Bean的流程。
我们从DefaultBeanDefinitionDocumentReaderd的parseBeanDefinitions⽅法开始讲解,具体代码如下:
因为<context:component-scan>元素并⾮默认元素,所以执⾏delegate.parseCustomElement(ele)⽅法,parseCustomElement⽅法的代码如下:
第6⾏是获取命名空间处理器,处理器为:ContextNamespaceHandler。
接下来执⾏NamespaceHandlerSupport的parse⽅法,具体代码如下:
第2⾏是获取BeanDefinition的分析器,分析器为:ComponentScanBeanDefintionParser。接下来执⾏ComponentScanBeanDefinitionParser的parse⽅法,具体代码如下:
第3⾏是获取需要扫描的包,包名为:net.biancheng.c。
第5⾏是获取扫描器,扫描器为:ClassPathBeanDefinitionScanner。
接下来执⾏ClassPathBeanDefinitionScanner的doScan⽅法,具体代码如下:
第8⾏是扫描该包下所有添加@Component注解的类,并⽣成BeanDefintion。
第29⾏是向IoC容器注册BeanDefinition。
⾄此,对添加@Component注解的类定义成Bean的流程已经讲解完毕。
注:@Controller、@Service、@Repository注解组合了@Component注解。
2、@Autowired
@Autowired的作⽤是建⽴Bean与Bean之间的依赖关系并进⾏注⼊。
该注解能起效果依托于AutowiredAnnotationBeanPostProcessor这个Bean的后置处理器。@Value注解也是依托于这个后置处理器。
注:配置<context:component-scan>元素会静默的向IoC容器注册AutowiredAnnotationBeanPostProcessor这个后置处理器。
spring ioc注解该后置处理器有两个⽅法,分别为:postProcessMergedBeanDefinition和postProcessPropertyValues。
1)postProcessMergedBeanDefinition⽅法
postProcessMergedBeanDefinition⽅法的作⽤是查Bean中标识@Autowired注解的属性。
在Bean实例化(AbstractAutowireCapableBeanFactory的createBeanInstance⽅法)之后,就会触发执⾏该⽅法,触发代码如下:
2)postProcessPropertyValues⽅法
postProcessPropertyValues⽅法的作⽤是对标识@Autowired注解的属性进⾏注⼊。
在AbstractAutowireCapableBeanFactory的populateBean⽅法⾥会执⾏该⽅法,执⾏代码如下:
注:更多的注解可以看《Spring 常⽤注解⼤全》

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。