本文基于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 常用注解大全》
网友评论