大家好,关于本文将带你了解从Spring的@Enable开始的注解很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
@EnableRetry:启用Spring的重试功能; @EnableScheduling:启用Spring的定时功能; @EnableAsync:启用Spring的异步功能; @EnableAutoConfiguration:启用Spring的自动装配功能;以上是我们经常使用的,看到的大家都知道,在使用相应的功能时,如果不配置的话,上面的注解功能是不会生效的。以我们上一篇文章中的Spring重试为例,我们需要在启动类上配置@EnableRetry,否则自动重试注解@Retryable不会生效,如下所示。没看过的可以看看,Java远程调用失败?如何优雅地重试?
@Import 注解
有的朋友可能会问,这个@EnableRetry注解的作用是什么?不使用这个注解我们就没有什么办法了吗?
![]()
要知道这个注解有什么作用,我们可以点击它看一下源码。代码如下
包org.springframework.retry.annotation;导入java.lang.annotation.Documented;导入java.lang.annotation.ElementType;导入java.lang.annotation.Retention;导入java.lang.annotation.RetentionPolicy;导入java.lang.注解.Target;导入org.springframework.context.annotation.EnableAspectJAutoProxy;导入org.springframework.context.annotation.Import;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@EnableAspectJAutoProxy(proxyTargetClass=false)@Import( RetryConfiguration.class)@Documentedpublic @interface EnableRetry { boolean proxyTargetClass() default false;} 可以看到源码很简单,最有用的就是@Import(RetryConfiguration.class)这一行。我们可以尝试将这行代码放到启动类中看看上面的效果。如下图,可以看到项目可以正常启动,并且仍然有效。其解释与我们的@EnableRetry注解相同。
从上面的实验结果我们可以看出,@EnableRetry注解实际上是对@Import(RetryConfiguration.class)的封装。同样,通过源码我们也可以看到,@EnableScheduling注解是对@Import({SchedulingConfiguration.class})的一个封装。
![]()
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Import({SchedulingConfiguration.class})@Documentedpublic @interface EnableScheduling {}如果没有@Enablexxx注解,我们可以直接将@Import注解写成这样一种方式,一个@Import注解包含多个配置类。但这样在配置类较多的场景下就显得比较不简洁,所以有@Enable注解对应各自的功能。
包com.example.demo;导入org.springframework.boot.SpringApplication;导入org.springframework.boot.autoconfigure.SpringBootApplication;导入org.springframework.context.annotation.ComponentScan;导入org.springframework.context.annotation.Import;导入org.springframework.retry.annotation.RetryConfiguration;导入org.springframework.scheduling.annotation.SchedulingConfiguration;@SpringBootApplication@ComponentScan(value='com.example.demo.*')@Import({RetryConfiguration.class, SchedulingConfiguration.class} )public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }}
为什么要使用 @Import 注解呢
那么很多朋友又在问了,为什么我们需要使用@Import注解呢?那么加载配置类呢?直接从项目中的Spring上下文中获取不就可以了吗?为此,我们来实验一下。通过下面的代码我们可以看看能否获取到Spring容器中RetryConfiguration的Bean。
![]()
包com.example.demo;导入org.springframework.boot.SpringApplication;导入org.springframework.boot.autoconfigure.SpringBootApplication;导入org.springframework.context.ConfigurableApplicationContext;导入org.springframework.context.annotation.ComponentScan;导入org. springframework.context.annotation.Import;导入org.springframework.retry.annotation.RetryConfiguration;导入org.springframework.scheduling.annotation.SchedulingConfiguration;@SpringBootApplication@ComponentScan(value='com.example.demo.*')//@ Import({RetryConfiguration.class, SchedulingConfiguration.class}) public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext=SpringApplication.run(DemoApplication.class, args); }对象bean=applicationContext.getBean('org .springframework.retry.annotation.RetryConfiguration'); System.out.println(bean.toString()); }}启动后,我们可以看到如下结果,提示我们在容器中找不到bean。有的朋友会问是不是bean的名字写错了,但事实并非如此。然后我们释放注释行并再次运行它。
可以看到,我们这次成功获取到了这个Bean。这个实验告诉我们,其实默认情况下,Spring容器中是找不到RetryConfiguration Bean的,所以我们需要使用@Import注解来添加该Bean。类被加载到容器中。
那么为什么在容器中找不到这个bean呢?

用户评论
spring boot 的学习笔记里总看到这段代码,还没深入研究过,现在看这篇博客终于明白了!这些注解真是太厉害了,能让开发效率直线提升啊
有6位网友表示赞同!
Spring Boot 的 @Enable 开始的注解确实强大,像 @EnableAutoConfiguration 居然能帮你自动配置大部分组件,真是黑科技!感觉学习 Spring Boot 要从这个入手才对
有6位网友表示赞同!
其实我一直觉得这些注解很抽象,看不懂代码,这篇博文写的蛮清晰了!希望以后还能看到更多这样的讲解,特别是那些比较高级的注解
有19位网友表示赞同!
写博客的同学很棒啊!把 @EnableAutoConfiguration、@EnableMessageListener 等常用的注解都介绍了一遍,学习效果超级棒! 以后只要记住这些注解就能快速启动 Spring Boot 应用了 哈哈!
有5位网友表示赞同!
这篇博文写的挺好的,终于明白为啥 Spring 中要用这么多开头的注解。简单易懂,对新手小白也很友好
有15位网友表示赞同!
说的不错,@EnableAutoConfiguration 这个注解简直是春天的福音!以前我手写配置文件都花了好长时间,有了它就不需要再费心啦
有9位网友表示赞同!
还是感觉有些地方不够详细,像 @EnableSecurityAutoConfiguration 的配置和使用场景,可以多展开讲讲。毕竟我们实际开发中经常会遇到安全相关的需求
有10位网友表示赞同!
这种注解虽然好用,但是也太抽象了!我希望以后能看到一些更具体的案例,这样更容易理解它的功能和应用场景
有9位网友表示赞同!
博文写的挺清楚的,但Spring Boot 的组件配置还是太复杂了,尤其是一些高级的注解,感觉学习起来不是很容易。希望能有更详细的教程可以参考
有15位网友表示赞同!
看标题以为要讲具体的注解使用方法,结果就介绍了一点功能和作用。其实我对这些注解的使用场景更感兴趣啊!
有19位网友表示赞同!
这篇博文的总结倒是写的不错的, @Enable 开头的注解确实是 Spring Boot 开发中不可或缺的一部分,学习起来却也不那么友好
有7位网友表示赞同!
@EnableAutoConfiguration 这类注解确实简化了很多开发工作,但是如果过度依赖的话也可能会导致代码复用率低啊!建议在使用前好好权衡利弊
有12位网友表示赞同!
说这么多 @Enable 开头的注解,感觉其实就是一种高级的配置方式吧?还是想念以前简单直接的配置文件了 哈哈!或许是经验不足吧,没感觉到这些注解带来的优势
有13位网友表示赞同!
理解 Spring Boot 的核心要从这些 @Enable 开始的注解入手。文章写的可以理解,建议以后补充一些使用案例,更直观地展示它们的功能。
有17位网友表示赞同!
感觉这篇博文有点过于简单粗略,没有深入解释 @Enable 开头的注解背后的原理以及适用场景。希望作者能够再开一篇更详细的文章,分享更多的细节
有15位网友表示赞同!
作为一名 SpringBoot 开发者,对这些 Annotation 已经是轻车熟路,但文章还是比较好的入门教程,可以帮助新手快速了解关键信息
有13位网友表示赞同!
博主讲解思路很清晰,把 @Enable 开头的注解都概括了, 我在学习 spring-boot 时也能帮到我了!但是希望作者能介绍一下不同项目场景下选择合适的注解策略,比如安全性配置和数据库连接
有9位网友表示赞同!
看了博客后感觉这些注解还是很有用的,特别是像 @EnableRedis 等,可以方便我们使用 Redis 做缓存。但需要更深入的了解才能熟练运用 !
有10位网友表示赞同!