# 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)

曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享

曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解

曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下

曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的?

曹工说Spring Boot源码(5)-- 怎么从properties文件读取bean

曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的

曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上)

曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间)

曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上)

工程代码地址 思维导图地址

工程结构图:

# 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)

概要

本篇已经是spring源码第10篇了,为了让新同学也能知道我在讲什么,所以有些东西必须得重复一下。

先给大家看看spring支持的xml配置,我列了个表格如下:

namespace element
util   constant、property-path、list、set、map、properties  
context   property-placeholder、property-override、annotation-config、component-scan、load-time-weaver、spring-configured、mbean-export、mbean-server  
beans   import、bean、alias  
task   annotation-driven、scheduler、scheduled-tasks、executor  
cache   advice、annotation-driven  
aop   config、scoped-proxy、aspectj-autoproxy  

我题目的意思是,spring在解析每个不同的xml元素时,其实是有共性的。所有这些元素的解析器,都实现了BeanDefinitionParser。这个接口只有一个方法,作用就是解析元素时,根据元素的配置,来收集beanDefinition,正所谓:条条大道通罗马,各种xml配置元素,各种注解配置,就是那些大道,罗马是什么?

就是beanDefinition。

从第一篇到现在,已经第10篇了,我们还在讲bean definition,其实就是因为,只有深刻地理解了它,后面才能更方便地理解spring boot,理解configuration注解,理解enable,理解自动装配。

前面我们讲了util命名空间,spring从中主要获得了几个工厂bean类型的beanDefinition;也讲了context命名空间的、,这两个呢,主要是获得了beanFactoryPostProcessor这样的有特殊技能的bean的beandefinition。

以上呢,注意,都是beanDefinition,不是bean。拿java举例,前者是class,后者是instance。

本讲,继续context命名空间。

context:annotation-config 说明

该元素相当重要,xml时代,基本是必不可少。我专门找了个几年前的项目,以下是截图:

# 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)

但是,为什么要配置这个?估计很多人到现在也是一脸懵逼,包括之前的我;配置了之后,有什么用?还是一脸懵逼;再问你,为啥spring boot时代不需要配置这个了呢?

想必,面试这么随便问两下,很多人也答不上吧,这讲我们就来讲讲它。

先看看xsd里的说明:

Activates various annotations to be detected in bean classes: Spring's @Required and@Autowired, as well as JSR 250's @PostConstruct, @PreDestroy and @Resource (if available),JAX-WS's @WebServiceRef (if available), EJB3's @EJB (if available), and JPA's@PersistenceContext and @PersistenceUnit (if available). Alternatively, you maychoose to activate the individual BeanPostProcessors for those annotations.Note: This tag does not activate processing of Spring's @Transactional or EJB3's@TransactionAttribute annotation. Consider the use of the tag for that purpose.

我用我刚过线的六级水平翻译一下:

使bean class中的多种注解可以被识别:

Spring提供的@Required、@Autowired;

JSR 250提供的@PostConstruct, @PreDestroy,@Resource

JAX-WS 提供的@WebServiceRef

EJB3 提供的 @EJB

JPA 提供的@PersistenceContext and @PersistenceUnit

另外,你也可以选择激活单独的对应这些注解的BeanPostProcessors。

注意,这个注解不能激活 @Transactional的注解的识别,如果要识别这个,请使用 tx:annotation-driven

反正呢,如果你项目里要用这一堆注解,肯定得有对应的代码来解析这些注解吧,那是什么代码来解析呢?

细心的同学可能看到了,就是BeanPostProcessor。这个注解呢,其实就是注册一堆的BeanPostProcessor。

用法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpggws.html