首页 > 自考资讯 > 自考资讯

本文将带你了解从Spring的@Enable开始的注解

2024-10-09

大家好,关于本文将带你了解从Spring的@Enable开始的注解很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

@EnableRetry:启用Spring的重试功能; @EnableScheduling:启用Spring的定时功能; @EnableAsync:启用Spring的异步功能; @EnableAutoConfiguration:启用Spring的自动装配功能;以上是我们经常使用的,看到的大家都知道,在使用相应的功能时,如果不配置的话,上面的注解功能是不会生效的。以我们上一篇文章中的Spring重试为例,我们需要在启动类上配置@EnableRetry,否则自动重试注解@Retryable不会生效,如下所示。没看过的可以看看,Java远程调用失败?如何优雅地重试?

@Import 注解

有的朋友可能会问,这个@EnableRetry注解的作用是什么?不使用这个注解我们就没有什么办法了吗?

本文将带你了解从Spring的@Enable开始的注解

要知道这个注解有什么作用,我们可以点击它看一下源码。代码如下

包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})的一个封装。

本文将带你了解从Spring的@Enable开始的注解

@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。

本文将带你了解从Spring的@Enable开始的注解

包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呢?

用户评论

刺心爱人i

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位网友表示赞同!

七夏i

博主讲解思路很清晰,把 @Enable 开头的注解都概括了, 我在学习 spring-boot 时也能帮到我了!但是希望作者能介绍一下不同项目场景下选择合适的注解策略,比如安全性配置和数据库连接

    有9位网友表示赞同!

寻鱼水之欢

看了博客后感觉这些注解还是很有用的,特别是像 @EnableRedis 等,可以方便我们使用 Redis 做缓存。但需要更深入的了解才能熟练运用 !

    有10位网友表示赞同!

猜你喜欢