美文网首页
Spring @Component和@Autowired注解解析

Spring @Component和@Autowired注解解析

作者: 代码的搬运工 | 来源:发表于2022-02-18 23:11 被阅读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 常用注解大全

    相关文章

      网友评论

          本文标题:Spring @Component和@Autowired注解解析

          本文链接:https://www.haomeiwen.com/subject/qakllrtx.html