Spring @Component和@Autowired注解解析

2022-02-18  本文已影响0人  代码的搬运工

本文基于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方法的代码如下:

第2行是获取命名空间的URI地址,URL地址为:http://www.springframework.org/schema/context。

第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这个后置处理器。

该后置处理器有两个方法,分别为:postProcessMergedBeanDefinition和postProcessPropertyValues。

1)postProcessMergedBeanDefinition方法

postProcessMergedBeanDefinition方法的作用是查找Bean中标识@Autowired注解的属性。

在Bean实例化(AbstractAutowireCapableBeanFactory的createBeanInstance方法)之后,就会触发执行该方法,触发代码如下:

2)postProcessPropertyValues方法

postProcessPropertyValues方法的作用是对标识@Autowired注解的属性进行注入。

在AbstractAutowireCapableBeanFactory的populateBean方法里会执行该方法,执行代码如下:

注:更多的注解可以看《Spring 常用注解大全

上一篇下一篇

猜你喜欢

热点阅读