首页>>后端>>Spring->Spring的成长之Spring注解驱动篇

Spring的成长之Spring注解驱动篇

时间:2023-11-29 本站 点击:0

前言

了解一件人最好的方式就是了解他的过去,那spring的过去是什么呢,他是怎么成长成现在的样子的呢?现在就来聊一聊。

Spring1x 非注解驱动时代

jdk1.5时,java推出了注解开发,极大简化了开发流程,省了很多代码,spring也开始使用注解,但是在spring1x中是不支持注解的,只能通过xml配置。

Spring 2x 注解过度时代

这时依赖注入注解@Autowire 依赖查找注解@Quafiler,组件声明注解@Component,@Service登场,还有@PostConstruct @PreDestory注解也替换了 xml的 init-mehod destory-method生命周期的回调接口,同时引入了@Scope 替换了 xml 的scope配置,但是注解的使用还是要通过xml的配置<context:annotation-config><context:conponent-scan> 来实现注册,所以他并不完全。

Spring3x 注解黄金时代

spring3.0这时候出现了一个@Cofiguration,而且也引入了注解的派生性,注解时不能被继承的,但是却又派生特性,

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic@interfaceConfiguration{@AliasFor(annotation=Component.class)Stringvalue()default"";}

@Cofiguration就是@Component的派生注解,而且这时就不用 <context:annotation-config>来激活注解了,但是仍然没有解决需要<context:conponent-scan> 来扫描的问题,但是做了一个过渡方案,就是使用@Import和@ImportRescource注解。

@ImportResource("classpath:/META-INF/spring/others.xml")@Configuration("springContextConfiguration")publicclassSpringContextConfiguration{

但是这种也是有问题的,既然others.xml可以引导,那么写<context:conponent-scan>就是一件重复的事。

spring3.1鉴于3.0版本的尴尬,3.1出现了一个替代<context:conponent-scan>的注解@ComponetScan,还有不同环境的激活注解@Profile。

@Configuration("springContextConfiguration")@ComponentScan(basePackages="thinking.in.spring.boot.samples")//替代<context:component-scan>@Profile("!production")//非生产环境publicclassSpringContextConfiguration{

同时新增了@ResponseBody,将返回对象处理方法序列化为rest主体内容,@Enviroment,@PropertySources,实现spring外部化配置基础,提供异步化操作注解@Ansync,周期异步执行注解@Schecule,校验方面新增校验注解@Validate,缓存方面新增@Cache,还有@EnableMvc注解等等。

Spring4x 注解完善时代

@Profile提供了配置化条件组装,不过存在一个问题,他没办法根据条件来判断加载,所以4x中引入了条件化注解@Conditional,弥补可@Profile的短板,@Profile从4x开始也变成了由@Conditional来实现,并且Spring Boot中所有的@Conditional*注解都是由@Conditional派生的。

派生由于注解不存在继承,所以只能通过派生来处理,派生页有限制条件,他需要保持注解之间有相同的属性方法。为了解决这个限制@Aliasfor注解诞生了。

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters={@Filter(type=FilterType.CUSTOM,classes={TypeExcludeFilter.class}),@Filter(type=FilterType.CUSTOM,classes={AutoConfigurationExcludeFilter.class})})public@interfaceSpringBootApplication{@AliasFor(annotation=EnableAutoConfiguration.class)Class<?>[]exclude()default{};@AliasFor(annotation=EnableAutoConfiguration.class)String[]excludeName()default{};@AliasFor(annotation=ComponentScan.class,attribute="basePackages")String[]scanBasePackages()default{};@AliasFor(annotation=ComponentScan.class,attribute="basePackageClasses")Class<?>[]scanBasePackageClasses()default{};}
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})public@interfaceEnableAutoConfiguration{StringENABLED_OVERRIDE_PROPERTY="spring.boot.enableautoconfiguration";Class<?>[]exclude()default{};String[]excludeName()default{};}

这样@SpringBootApplication注解就有了@EnableAutoConfiguration注解的能力。

Spring5x 注解当下时代

5x是spring boot2.0的底层框架,其中引入了@indexed注解提升扫描效率,以及@NonNull,@Nullable注解等。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/285.html