spring enable注解,spring enable原理
@启用注解首先我们先看一下有哪些常用的@启用开头的注解,以及都是干什么用的。
@EnableRetry:开启春天的重试功能;@启用调度:开启春天的定时功能;@EnableAsync:开启春天的异步功能;@启用自动配置:开启春天的自动装配功能;上面这几个是我们经常会用到和看到的,都知道在使用相应的功能的时候,如果没有配置上面的注解功能都是不生效的。以我们前面的文章的春天重试为例,我们需要在启动类上面配置@EnableRetry,否则自动重试注解@可重试是不会生效的,如下所示,没看过的可以去看下,Java远程调用失败?如何优雅的进行重试?
@导入注解那有的小伙伴就要问了,这个@EnableRetry注解到底有什么作用呢?不用这个注解就没办法了吗?
要知道这个注解有什么功效,我们可以点开看看源码,代码如下
包org。spring框架。重试。注释;
导入Java。郎。注释。记录在案;
导入Java。郎。注释。元素类型;
导入Java。郎。注释。保留;
导入Java。郎。注释。保留政策;
导入Java。郎。注释。目标;
导入组织。spring框架。语境。注释。enableaspectjautoproxy
导入org。spring框架。语境。注释。进口;
@Target(ElementType .类型)
@保留(保留政策.运行时间)
@ EnableAspectJAutoProxy(proxyTargetClass=false)
@ Import(重试配置。类)
@已记录
public @interface EnableRetry {
布尔proxyTargetClass()默认值为错误的
}可以看到源码很简单,其中最有用的就一行@ Import(重试配置。类),我们可以尝试把这一行代码放到启动类上面看看效果,如下所示,可以看到项目可以正常启动,并且也还是有效果的,说明跟我们的@EnableRetry注解是一样的。
从上面的实验效果我们可以看到@EnableRetry注解其实就是对@ Import(重试配置。类)的一个封装,同样的通过源码我们还可以看到@启用调度注解就是对@ Import({调度配置。class })的一个封装。
@Target({ElementType .类型})
@保留(保留政策.运行时间)
@ Import({调度配置。class })
@已记录
公共@接口启用调度{
}那如果在没有@Enablexxx注解的时候,我们直接通过@导入注解是可以这样写的,在一个@导入注解里面包含多个配置类,不过这种在配置类较多的场景下还是相对不够简洁的,因而才有了各自功能对应的@启用注解。
包com。举例。演示;
导入org。spring框架。靴子。春季申请;
导入org。spring框架。靴子。自动配置。弹簧启动应用程序;
导入org。spring框架。语境。注释。组件可以;
导入org。spring框架。语境。注释。进口;
导入org。spring框架。重试。注释。重试配置;
导入org。spring框架。日程安排。注释。调度配置;
@SpringBootApplication
@ components可以(value= com。举例。演示。* )
@ Import({重试配置。class,SchedulingConfiguration.class})
公共类演示应用程序{
公共静态void main(String[] args) {
春季申请。运行(演示应用程序。class,args);
}
}为什么要使用@导入注解呢?那么很多的小伙伴又要问了,为啥要通过使用@导入注解将配置类加载进来呢?在项目中的春天上下文中不是能直接获取到吗?为此我们来实验一下,通过下面的代码我们看下是否能在春天的容器中获取到重试配置的豆
包com。举例。演示;
导入org。spring框架。靴子。春季申请;
导入org。spring框架。靴子。自动配置。弹簧启动应用程序;
导入org。spring框架。语境。可配置的应用程序上下文;
导入org。spring框架。语境。注释。组件可以;
导入org。spring框架。语境。注释。进口;
导入org。spring框架。重试。注释。重试配置;
导入org . spring framework . scheduling . annotation . scheduling configuration;
@SpringBootApplication
@ components can(value= com . example . demo . * )
//@ Import({ retry configuration . class,SchedulingConfiguration.class})
公共类演示应用程序{
公共静态void main(String[] args) {
ConfigurableApplicationContext application context=spring application . run(demo application . class,args);
object bean=application context . get bean( org . spring framework . retry . annotation . retry configuration );
system . out . println(bean . tostring());
}
}启动后,我们可以看到下面的结果,提示我们在容器中找不到这个bean。有些朋友会说是不是豆子的名字写错了,其实不是。然后我们会释放注释行并再次运行它。
正如你所看到的,这次我们成功地获得了这个Bean。这个实验告诉我们,实际上默认情况下,在Spring的容器中找不到RetryConfiguration Bean,所以我们需要使用@Import注释将这个类加载到容器中。
那么为什么我在容器里找不到这个豆子呢?
其实很简单,因为这个Bean和我们目前环境下的类在同一个包里,RetryConfiguration类所在的包在项目启动的时候不会被扫描,所以找不到很正常。
总之,注释@EnableRetry向您展示了如何在Spring中使用@Enable开头的注释。相信你对这些注解有了更深的理解。简单来说,由于我们要用的很多类都不在我们项目所在的包下,我们无法扫描所有的依赖包,也不方便通过@Import导入所有的配置类。而是让每个函数的项目包提供一个以@Enable开头的注释,我们直接启用注释就可以达到效果。
这样我们也可以在平时的开发中自己实现,在@Enable的开头实现自己的注释来实现具体的功能。
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。