启蒙阶段 – Spring 1.x
1.2.0
- 支持JDK1.5+ @ManagedResource、@Transactional等
过渡阶段–> Spring 2.x
2.0
- 支持 @Required、@Repository 、@Aspect
2.5
- 引入依赖注入@Autowired
- 依赖查找@Qualifier、
- 组件声明@Component、@Service
- SpringMVC @Conroller、@RequestMapping @ModeAttribute;
- 支持JSR-250 @Resource
- 支持JSR-250 生命周期回调@PostConstruct @PreDestroy ;
- 支持自定义注解;
黄金阶段–> Spring 3.x
3.0
- 引入配置类注解@Configuration ;
- 引入@Import、@ImportResource;
- 引入xml替换注解@DependsOn、@Lazy 、@Primary;
- 引入Rest开发 @PathVariable、@ResponseStatus
3.1
- 抽象了全新的一套配置属性API:Environment、PropertySources @PropertySource;
- 抽象了缓存:缓存Cache、缓存管理器CacheManager @Caching @Cacheable;
- 引入异步支持@Async、周期异步执行@Scheduled
- 异步Web请求处理DeferredResult
- 检验方面引入:@Valiated 整合了JS-303 Validation1.0
- 支持@Enable 模块驱动,例如@EnableWebMvc
- 支持@Profile条件组装
完善阶段–> Spring 4.x
4.0
- 引入条件化注解 @Conditionnal 通过与自定义Condition实现配置,弥补之前版本条件装配的短板
- 支持Java8,兼容了JSR-310
- 支持@Repeatable及参数名称发现,解决了以往Annotation无法重复标注在同一个类上的限制;
4.2
- 新增了时间监听器@EventListener,作为ApplicationListener接口编程的第二选择;
- 新增了@AliasFor注解,解除了@Repository作为@Component的派生注解,都存在相同属性方法values()的限制,同事还能再统一注解内实现属性方法的别名;
- 引入了@CrossOrigin作为CorsRegistry的替换方案
4.3
- 提升并引入了@ComponentScans
- 增强Rest特性:@GetMapping @PostMapping、@RestConroller @RestControllerAdvice
最新阶段 --Spring 5.x
5.0
- 引入@Indexed 注解为Spring模式注解添加索引,以提升启动性能:
- 引入了JS-305的适配注解,@NonNull @Nullable,为Java与Kotlin之间提供技术杠杠;
Spring Framework 5.0 作为Spring Boot 2.0的底层核心框架,注解驱动的性能提升不是那么明显,在Spring Boot应用场景中,大量的使用了@ComponentScan扫描指定的package,当扫描的package越来越多时,Spring模式注解的解析耗时就越长;
@Indexed不能独立存在,需要增加依赖:
<!-- Spring 5 索引依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>${spring.version}</version>
<optional>true</optional>
</dependency>
当编译构建时,会在META-INF/spring.components文件自定生成,当Spring应用上下文执行@ComponentScan扫描时,META-INF/spring.components 被CandidateComponentsIndexLoader读取加载,并转化为CandidateComponentsIndex,进而@ComponentScan不再扫描指定package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的。不过目前这种方式存在缺陷,比如应用启动存在a.jar, b.jar 都含有META-INF/spring.components,那么扫描时@ComponentScan至扫描其中的一个;