一、前言
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 ,整个注解发展过程,完。
天天打码,天天进步!!!