SpringFramework注解的发展与演变,从Spring 1.x到Spring 5.x

579 阅读5分钟

一、前言

SpringFramework注解的发展过程就是一个不断消除xml文件的过程。

二、Spring1.x

Spring 1.x 提供IOC功能,即不再通过new来创建,而是通过bean来管理,在xml配置

<bean name="" class="" />   

Spring 1.x 只有一个@Transaction 注解,整个项目的IOC都是通过xml配置文件来完成。

代码演示:

新建一个HelloService,

在这里插入图片描述

spring配置文件applicationContext.xml中配置
在这里插入图片描述

主函数运行:

在这里插入图片描述

小结:spring1.x spring配置文件applicatonContext.xml 中一大堆的

三、Spring2.x

为了解决spring1.x spring配置文件applicatonContext.xml 中一大堆的,Spring 2.x 发生变革。

Spring2 引入了 @Required/@Repository(用于dao层)/@Aspect 等注解。

特别是spring 2.5,引入大量注解,包括:
@Component(用于非service组件)
@Service (用于service层)
@Controller (用于controller层)
@RequestMapping (用于接收请求,一般404就是这里的问题)

Spring2.x版本,特别是spring 2.5 通过引入@Controller @Service只写注解,配合上注解扫描,彻底解决spring配置文件中一大堆的的问题。

代码演示:

新建Hello2Service,使用注解@Service

在这里插入图片描述

在这里插入图片描述
主函数运行

在这里插入图片描述

在spring2.x,我们知道 注解+扫描 == xml,注解不再applicationContext.xml文件大,但是扫描还在applicationContext.xml中,我们的下一步目的是将扫描从applicationContext.xml中取出,去xml化。

@Autowired @Resource
自动装配,Bean类中不再需要setter-getter,项目中,常用的是,在controller自动装配service,在serviceImpl中装配Mapper。

@Component
不再需要在applicationContext.xml中写各种,只要在具体Bean类上面加上@Component,在applicationContext.xml中<context:component-scan
base-package=“xxxx”/> 项目中,使用 @Controller @Service @Repository然后用
component-scan 扫描。(注意@Mapper不是这样,它是ibatis注解,使用@MapperScan扫描)

问题:Spring2.x 还是需要配置文件applicationContext.xml,能否将这个文件去掉呢?

四、Spring3.x(无配置化bean装配)

为了解决Spring2.x 中还是需要配置文件applicationContext.xml,Spring 3.x 出来了。

spring3.x 如何实现完全去xml化?

Spring3.x 的两大革新:

第一,对于自己的东西,即bean的class为自己类的东西,去xml化,使用@Configuration+@ComponentScan+其他具体注解;

第二,对于第三方组件的东西,即bean的class不是自己的,使用@Enable模块驱动。

4.1 自己的bean去xml化

4.1.1 去xml化解决IOC

spring 3.x 是一个里程碑版本,全面拥抱Java5,全面支持注解annotation(其中,最重要的是,提供一个取代applicationContext.xml配置文件的注解 @Configuration和@ComponentScan,可以去掉applicationContext.xml文件)

@ComponentScan用来扫描 @Controller @Service @Repository
注解替换xml的核心 xml == 注解+扫描所以xml是不需要扫描的,但是注解一定要扫描

方式1:@Configuration + @Bean
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

方式2:@Configuration + @ComponentScan +@Service(这个@Service可以是其他,只要能扫描到就可以)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.1.2 去xml化解决依赖注入

核心目的是:把bean对象如何更加快捷的方式加入的Spring IOC容器中

方式1:@Configuration + @Bean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

方式2:@Configuration + @ComponentScan +@Service(这个@Service可以是其他,只要能扫描到就可以)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.1.3 @Import注解(扩大扫描范围)

为了需要完全去xml化,还有其他注解,比如@Import注解。

@Import注解和 标签一样,在spring配置文件中,导入另外一个jar包或某一个目录下的配置文件,合并导入的配置文件的信息,其中使用到的claspath:表示resources目录。

方式1:同时读取两个Configuration.class

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

方式2:@Import注解将一个Configuration.class导入到另外一个Configuration,主程序只要读取总的Configuration.class

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小结:核心本质还是去xml,将两个配置文件合并在一起。

附:看一下@Import注解里面,

在这里插入图片描述

4.1.4 @Scope注解

@Scope注解 用来改变spring中@Bean或的生命周期,略过。

4.2 第三方bean去xml化

@Enable 是模块驱动注解,spring自带很多@Enable,如下:
在这里插入图片描述
我们现在已经可以完成自己的bean管理,那么对于第三方bean的管理怎么办?

在spring3.x,集成redis或mybatis步骤:

1、创建一个配置类服务于第三方组件
2、@Bean注解声明一个bean配置类

@Bean
DefaultKaptcha DefaultKaptcha(){   }

3、@Enable启动一个模块,把第三方组件的整个bean自动装配到IOC容器里面,这就是模块驱动

以使用Schedule定时器为例,展示xml和@Enable注解两种方式。

方式1:xml方法管理第三方Bean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

方式2:@Enable管理第三方Bean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

附1:xml如何实现定时器的

在AnnotationDrivenBeanDefinitionParser.java,这个是注解驱动bean定义的解析类,就是这个类实现定时器的。
在这里插入图片描述
附2:@EnableScheduling 注解如何实现定时器
进入@EnableScheduling注解

在这里插入图片描述

进入@Import({SchedulingConfiguration.class}) 指定类,这里就是新建Scheduler注解解析的。
在这里插入图片描述

小结

所以,@EnableScheduling,这个注解表示完成Schedule模块下bean的自动注入,启动Schedule注解驱动。

有了@EnableXxx注解,要用到schedule,就将schedule相关的bean注入,要用到redis,就将redis相关的bean注入,不需要配置xml文件也可以完成,是spring3.x 完成去xml的另一个重要特性。

在spring里面,官方提供的@Enable注解包括@EnableScheduling @EnableAsync @EnablewebMvc,实际上,我们还可以自己去实现、自定义自己的@EnableXxx注解。

五、Spring4.x(注解方式的完善)

5.1 @Conditional条件注解

@Conditional为bean的装载设置条件,条件不满足,bean不会被装载,条件满足,bean才会被装载。

比如,在某一环境下不装载,在某种条件下不装载或已经装载过就不再装载。

注意,spring的注解和springboot的注解不一样,springboot是在spring的基础上做了扩展。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

附:@Conditional注解底层怎么实现的
在这里插入图片描述

在这里插入图片描述

六、Spring5.x(注解性能上的优化)

@Indexed 用来提升性能的注解,略过。

七、小结

介绍了从Spring 1.x 到Spring 5.x ,整个注解发展过程,完。

天天打码,天天进步!!!