SpringFramework的两大核心,IOC(Inversion of control)控制反转和DI(Dependency Inject)依赖注入,其推崇的理念是应用系统不应以java代码的方式直接控制依赖关系,而是通过容器来管理。

Spring Framework 1.x 注解驱动启蒙时代

从Spring Framework 1.2.0版本开始,开始支持Annotation,虽然框架层面均已支持@managedResource和@Transactional等,但是其主要的还是以XML配置为准。

Spring Framework 2.X 注解驱动过渡时代

Spring Framework 2.0在Annotation支持方面添加了新的成员,@Required、数据相关的@Repository及AOP相关的@Aspect等,但同时提升了XML配置能力,即“可扩展的XML编写(Extensible XML authoring)”,当然的,这种扩展能力的出现,无形中为XML的配置增加了筹码。

Spring Framework2.5开始,引入了新的骨架式Annotation。

  • @Service
  • @Controller,@RequestMapping及@ModelAttribute

Spring Framework 2.5还支持了JSR-250(Java规范)。

@Resource注入

@PostConstruct 替代<bean init-method=”…”/>

@PreDestroy 替代<bean destroy-method=”…”/>

尽管Spring Framework 2.X时代提供了为数不少的注解,然而编程的手段却不多,最主要的原因在于框架层面仍未“直接”提供驱动注解的Spring应用上下文,并且仍需要XML驱动,<context:annotation-config>和<context:component-scan>

Spring Framework 3.x 注解驱动黄金时代

Spring Framework3.x是一个里程碑式的时代,3.0除了提升Spring模式注解“派生”的层次性,首要任务是替换XML配置方式,引入配置类注解@Configuration,该注解是内建的@Component的“派生”注解,遗憾的是,3.0并没有引入<context:component-scan>的注解,而是选择过渡方案——@ImportResource和@Import。ImportResource负责导入遗留的XML配置文件,Import允许导入一个或多个类作为Spring Bean。

3.0引入AnnotationConfigApplicationContext最为前时代ApplicationContext的替代者。3.1新引入注解@ComponentScan,替换XML的<context:component-scan>,成为全面进入注解驱动时代的一大步。

SpringFramework3.x注解提升还体现在以下方面:

  • 定义声明中,@Bean允许使用注解@Role设置其角色
  • 使得Spring应用上下文具备条件化Bean定义的能力
  • 方面,@RequestHeader,@CookieVale和@RequestPart出现,使得不必使用Servlet API
  • 以及配置属性源抽象PropertySources,奠定了SpringBoot外部化配置的基础。
  • 配套的注解Caching和Cacheable极大简化数据缓存的开发。
  • 周期异步@Schedule及异步web请求DeferredResult

Spring Framework 4.x 注解驱动完善时代

3.1开始提供@Profile提供了配置化的条件组装,不过这方面还是比较单一的,4.0开始,引入条件化注解@Conditional,通过自定义Condition实现配合,弥补之前版本条件化装配的短板,4.0开始Profile反过来通过@conditional实现。

Java8开始对提供@Repeatable,Framework4.0巧妙的兼容了JSR-310。根据特性,将@PropertySource、@ComponentScan提升为可重复使用的注解@PropertySources、@ComponentScans。

4.2开始

  • 新增了事件监听器注解@EventListener,作为ApplicationListener接口编程的第二选择。
  • @AliasFor解除注解派生的时候冲突限制
  • 在浏览器跨域资源访问方面,引入@CrossOrigin,作为CorsRegistry替换注解方案。

SpringFramework 5.x 注解驱动当下时代

SpringFramework5.0作为Spring Boot 2.0的底层,注解驱动的性能提升不是那么明显。在SpringBoot应用场景中,大量使用@ComponentScan扫描,导致Spring模式的注解解析时间耗时越长,面对这个问题,5.0引入@Indexed,为Spring模式注解添加索引。

Spring走向注解驱动编程的更多相关文章

  1. 死磕Spring之AOP篇 - Spring AOP注解驱动与XML配置

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  2. java框架之Spring(5)-注解驱动开发

    准备 1.使用 maven 创建一个 java 项目,依赖如下: <dependency> <groupId>org.springframework</groupId&g ...

  3. net core天马行空系列:原生DI+AOP实现spring boot注解式编程

    写过spring boot之后,那种无处不在的注解让我非常喜欢,比如属性注入@autowire,配置值注入@value,声明式事物@Transactional等,都非常简洁优雅,那么我就在想,这些在n ...

  4. 【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!

    写在前面 今天,面了一个工作5年的小伙伴,面试结果不理想啊!也不是我说,工作5年了,问多线程的知识:就只知道继承Thread类和实现Runnable接口!问Java集合,竟然说HashMap是线程安全 ...

  5. spring mvc 注解入门示例

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  6. spring mvc 注解示例

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  7. Spring 缓存注解解析过程

    Spring 缓存注解解析过程 通过 SpringCacheAnnotationParser 的 parseCacheAnnotations 方法解析指定方法或类上的缓存注解, @Cacheable ...

  8. 【spring 注解驱动开发】Spring AOP原理

    尚学堂spring 注解驱动开发学习笔记之 - AOP原理 AOP原理: 1.AOP原理-AOP功能实现 2.AOP原理-@EnableAspectJAutoProxy 3.AOP原理-Annotat ...

  9. 使用 Spring 2.5 基于注解驱动的 Spring MVC

    http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...

随机推荐

  1. G1垃圾收集器设计目标与改良手段【纯理论】

    在之前已经详细对CMS垃圾回收器进行了学习,今天准备要学习另一个全新的垃圾收集器---G1(Garbage First Collector 垃圾优先的收集器),说是一种全新的,其实G1垃圾收集器已经出 ...

  2. JDBC-DBUtils工具-[课本293]-ResultSetHander接口的三种实现类的BeanHander/BeanListHander/ScalarHander

    ---恢复内容开始--- ResultSetHander接口 1.使用BeanHandler()只返回第一行结果集 ,封装到一个对应的JavaBean中 ;eg: User user=(User)bd ...

  3. 【转】angular使用代理解决跨域

    原文:https://www.cnblogs.com/sghy/p/9111293.html ----------------------------------------------------- ...

  4. 设计模式之命令模式-JS

    理解命令模式 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.我们 ...

  5. 让你弄懂 call、apply、bind的应用和区别

    call.apply.bind使用和区别 // 有只猫叫小黑,小黑会吃鱼 const cat = { name: '小黑', eatFish(...args) { console.log('this指 ...

  6. java中使用redis --- Set集合的简单应用

    1.java代码 public class RedisTest01 { public static void main(String[] args){ // connect redis server ...

  7. vue 项目总结 知识点补充

    1.页面加载后自动执行函数  2.向后端请求数据方法 2-1 :axios 的安装使用 2-2 在组件中使用 2-3 发送请求 2-4 接收数据后渲染 2-5 后端数据渲染 2-6 解决跨域问题 任务 ...

  8. BZOJ2616 SPOJ PERIODNI(笛卡尔树 + DP)

    题意 N,K≤500,h[i]≤106N,K\le 500,h[i]\le10^6N,K≤500,h[i]≤106 题解 建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高 ...

  9. 定时器 延时调用setTimeout

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. MySQL 事务 MVCC 版本链

      版本链   对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含row_id列):  1) ...