Spring的两个核心思想是IOC和DI,业务通过XML配置类之间的关系,然而这导致XMl不断膨胀 ,越来越难以维护,而注解可以自动维护很多配置关系,因此从Spring2开始不断增加对注解的支持,以致于可以使用@Config+@Bean的方式彻底消除XML文件,之后更进一步实现了自动装配的功能,这直接促成了SpringBoot的诞生,所以要理解SpringBoot,我们必须先梳理一下注解驱动的问题。
此前我们一般是按照功能来划分注解的类型,例如装配,依赖注入,MVC等方面划分,今天我们按照历史发展的角度来梳理一下。
Spring注解的发展可以分为三个阶段:1和2是成型节点,3是成熟阶段,4和5是完善阶段。

1.注解成型阶段

注解可以有效降低配置文件的数量,因此Spring1就开始支持注解了,在Spring1中支持@ManagerResouce和@Transactional等注解,但是最重要的Bean仍然使用XML方式。
在Spring2中,不管是类型还是数量,提供的注解都比较多了。其中比较典型的是:
依赖注入的: @Autowired
依赖查找的:@Qualifier
组件声明的:@Component和@Service
SpringMVC的:@Controller,@RequestMapping和@ModelAttribute
数据相关:@Repository
AOP:@Aspect
另外还有一个比较特殊的:
@Qualifier:上面这些注解在查找依赖的时候,都是根据类型的,如果有相同的类型再进行查找则需要使用@Qualifier的配合来指定具体依赖的bean的名称。
另外,Spring2.5还支持@Resouce注入,包括Java规范中的生命周期@PostConstruct和@PreDestroy等。
这些注解都是现在频繁使用的。

2.注解成熟阶段: Spring3

Spring3引入的注解数量不太多 ,但是功能却强大很多。例如:
配置注解@Configuration,该注解也是@Component内建的注解。看代码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
	@AliasFor(annotation = Component.class)
	String value() default "";

}

不过Spring3并没有引入代替XML元素context:componet-scan的注解,而是选择了过渡方案@ImportResouce和@Import。前者允许导入遗留的xml配置文件,而@Import则允许导入一个或多个类作为SpringBean,而这些类无需再标注Spring的模式注解,如@Service,通常标注这两个的需要再标注@Configuration,例如:

@ImportResource("classpath:/META-INF/spring/others.xml")         // 替代<import>
@Configuration("springContextConfiguration")
@Profile("!production") // 非生产环境
public class SpringContextConfiguration {}

此时加载时该如何引导呢?为此使用了AnnotationConfigApplicationContext,作为最开始的引导类 ,但是使用比较别扭,为此在Spring3.1就引入了一个重要的注解@ComponentScan来代替context:componet-scan,这使得Spring真正进入面向注解驱动的时代。

此外还引入了@Profile来使得Spring应用具有根据环境条件定义Bean的能力。
在Web方面,注解@RequestHeader,@CookieValue和@RequestPart的出现,使得SpringMVC不必再直接使用Servlet API。
在REST方面,引入@RequestBody能直接反序列化请求内容,引入@ResponseBody表示处理方法返回对象序列化为REST主体。

还有面向异步操作的@Async,周期任务@Scheduled等。
还有用于校验的@Validated等。
总之,Spring3.1抽象了一套全新并统一的配置属性API,包括配置属性接口Environment,以及配置资源抽象PropertySources,这两个核心API是SpringBoot外部化配置的基础,也是SpringCLoud的基石。

3.注解驱动完善 Spring4和Spring5

Spring4的最大特点是引入了条件化注解@Condition,使得很多操作更为灵活,这个在SpringBoot中大量使用。
Spring5引入了@Indexed,为注解添加索引,提升启动性能。

我们可以看到,Spring4之后,重大注解就没有了,但是就在同期SpringBoot发展起来了,很多灵活的配置等特性都在SpringBoot中进行了。