【Spring boot读书笔记】 Spring 注解驱动演变

启蒙阶段 – 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至扫描其中的一个;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值