一文详解Spring的Enablexxx注解使用实例
作者:zi-you 发布时间:2023-09-03 08:43:18
引言
layout: post
categories: Java
title: 一文带你了解 Spring 的@Enablexxx 注解
tagline: by 子悠
tags:
- 子悠
前面的文章给大家介绍 Spring
的重试机制的时候有提到过 Spring
有很多 @Enable
开头的注解,平时在使用的时候也没有注意过为什么会有这些注解,今天就给大家介绍一下。
@Enable 注解
首先我们先看一下有哪些常用的 @Enable
开头的注解,以及都是干什么用的。
@EnableRetry
:开启Spring
的重试功能;@EnableScheduling
:开启Spring
的定时功能;@EnableAsync
:开启Spring
的异步功能;@EnableAutoConfiguration
:开启Spring
的自动装配功能;
上面这几个是我们经常会用到和看到的,都知道在使用相应的功能的时候,如果没有配置上面的注解功能都是不生效的。以我们前面的文章的 Spring
重试为例,我们需要在启动类上面配置 @EnableRetry
,否则自动重试注解 @Retryable
是不会生效的
@Import 注解
那有的小伙伴就要问了,这个 @EnableRetry
注解到底有什么作用呢?不用这个注解就没办法了吗?
要知道这个注解有什么功效,我们可以点开看看源码,代码如下
package org.springframework.retry.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@EnableAspectJAutoProxy(proxyTargetClass = false)
@Import(RetryConfiguration.class)
@Documented
public @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})
@Documented
public @interface EnableScheduling {
}
那如果在没有 @Enablexxx
注解的时候,我们直接通过 @Import
注解是可以这样写的,在一个 @Import
注解里面包含多个配置类,不过这种在配置类较多的场景下还是相对不够简洁的,因而才有了各自功能对应的 @Enable
注解。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.retry.annotation.RetryConfiguration;
import 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
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.retry.annotation.RetryConfiguration;
import 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);
Object bean = applicationContext.getBean("org.springframework.retry.annotation.RetryConfiguration");
System.out.println(bean.toString());
}
}
启动过后我们可以看到结果如下,提示我们在容器中找不到这个 bean
,有点小伙伴会说是不是 bean
的名字写错了,其实并不是,紧接着我们再把注释的那一行放开再运行一下。
可以看到,这次我们成功的获取到了这个 Bean
,这个实验就是告诉我们,其实在默认情况下,Spring
的容器中是找不到RetryConfiguration
这个 Bean
的,因此我们需要通过使用 @Import
注解,将该类加载到容器中。
那么为什么在容器中找不到这个 Bean
呢?
其实很简单,因为这个 Bean
跟我们当前环境的类是不是同一个包里面的,在项目启动的过程中并不会扫描到 RetryConfiguration
类所在的包,因此找不到是很正常的。
来源:https://www.cnblogs.com/zi-you/p/16920365.html


猜你喜欢
- 入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。一、Concurre
- 一、前言我们在做Winform窗体程序开发的时候,会经常遇到窗体之间相互传值。假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的
- 配置文件中使用${}注入值方式在springboot中使用System.setProperty设置参数user: user-na
- 本文实例讲述了Android编程实现分页加载ListView功能。分享给大家供大家参考,具体如下:package eoe.listview;
- 1.官网下载JDK:1.1下载地址:https://www.oracle.com/java/technologies/javase-down
- 初学spring,我在dao层初始化c3p0的时候,使用@Resource注解新建对象是发现注入为null,告诉我 java.la
- 本文实例讲述了Java实现将png格式图片转换成jpg格式图片的方法。分享给大家供大家参考,具体如下:import java.awt.Col
- 布局文件:res/layout/activity_my.xml[html] <LinearLayout xmlns:and
- 前言回调的核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。1、什么是回调软件模块之间总
- 本文实例为大家分享了Android双向选择控件DoubleSeekBar的使用方法,供大家参考,具体内容如下先看效果图1.DoubleSli
- 本文实例讲述了C#中Arraylist的sort函数用法。分享给大家供大家参考。具体如下:ArrayList的sort函数有几种比较常用的重
- 前言前面两篇文章我们已经学习了Lifecycle和DataBind,本篇文章我们来学习Jetpack系列中比较重要的ViewModel,Je
- Task执行任务,等待任务完成代码://任务Func<int> Funcs = () =>{? ? Console.Wri
- 1、try with catch还记得这样的代码吗?我们需要手动的关闭资源的流,不然会造成资源泄漏,因为虚拟机无法管理系统资源的关闭,必须手
- 在Java中,HashMap是一种常用的数据结构,它以键值对的形式存储和管理数据。然而,由于HashMap在多线程环境下存在线程安全问题,因
- 目录一 前言二 解决方法三 常见的错误案例分析1.错误:ERR_UNKNOWN_URL_SCHEME2.实现UC、华为浏览器处理的效果——&
- 应用场景最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑!社区的安全框架使用了 spring-sec
- 接收JSON浏览器传来的参数,可以是 key/value 形式的,也可以是一个 JSON 字符串。在 Jsp/Servlet 中,我们接收
- 方法一class Program { [STAThread] static
- 测试1: 先看一组String类型比较,废话不多说,直接上代码:public class Test {public static void