当前位置: 首页 > news >正文

springboot开发的常用注解总结-配置组件类注解

Spring Boot 提供了许多注解,这些注解大大简化了 Spring 应用的配置和开发过程。以下是一些常见的 Spring Boot注解及其作用。

目录

  • 配置组件类 (Configure Component )
    • @Configuration
      • 解释:
      • Demo Code:
      • 更深度使用:
    • @ComponentScan
      • 解释:
      • Demo Code:
      • 更深度使用:
    • @Scope
      • 解释:
      • Demo Code:
        • 1. Singleton(单例)
        • 2. Prototype(原型)
        • 3. Request(请求)
        • 4. Session(会话)
        • 5. Application(应用)
        • 6. WebSocket(WebSocket 会话)
        • 引申
    • @Lazy
      • 解释:
      • Demo Code:
      • 更深度使用:
    • @Conditional
      • 解释:
      • Demo Code 自定义一个Condition
    • @Import
      • 详解
      • 使用 Demo

配置组件类 (Configure Component )

@Configuration

解释:

@Configuration 注解用于指示一个类声明了一个或多个 @Bean 方法,并且可能被 Spring 容器作为 Bean
定义的源进行处理。它允许你通过 Java 配置的方式来替代 XML 配置文件。被 @Configuration 注解的类内部可以包含多个
@Bean 注解的方法,这些方法将返回对象,这些对象会作为 Spring 应用上下文中的 Bean。

被@Configuration 注解的类通常被称为 配置类。

Demo Code:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}class MyService {// Service methods
}class MyServiceImpl implements MyService {// Implementation details
}

更深度使用:

  1. 可以结合 @Import 注解来导入其他配置类。

  2. 使用 @Profile 注解来指定配置类只在特定的环境下激活。

  3. 可以使用 @Enable* 注解来启用特定的 Spring 功能(如 @EnableTransactionManagement)。

@ComponentScan

解释:

@ComponentScan 注解用于告诉 Spring 框架在包及其子包中查找被
@Component、@Service、@Repository、@Controller 等注解标记的类,并将这些类注册为 Spring应用上下文中的 Bean。

Demo Code:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = "com.example.demo")
public class AppConfig {// Configuration details
}// In package com.example.demo
@Service
public class MyService {// Service implementation
}

更深度使用:

  1. 可以通过 excludeFilters 和 includeFilters 属性来过滤扫描到的类。

  2. 可以设置 lazyInit 属性来指定是否延迟初始化扫描到的 Bean。

@Scope

解释:

@Scope 注解用于指定 Spring 容器中 Bean 的作用域。Spring
提供了几种作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)、请求(Request)等。

Demo Code:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.WebApplicationContext;@Configuration
public class AppConfig {@Bean@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)public MySessionBean mySessionBean() {return new MySessionBean();}
}class MySessionBean {// Session scoped bean
}
1. Singleton(单例)

解释:在 Spring 容器中,每个 Bean
只有一个实例,且这个实例会被存储在单例缓存中。对于所有的请求和会话,都会返回这个共享的实例。这是默认的作用域。

Demo:由于 Singleton 是默认作用域,所以通常不需要显式指定。但如果要强调其单例性质,可以这样写:

@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public MySingletonBean mySingletonBean() {return new MySingletonBean();
}
2. Prototype(原型)

解释:每次从 Spring 容器中请求该 Bean 时,都会创建一个新的实例。这意味着每个请求都会得到一个新的 Bean 实例。

Demo:

@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyPrototypeBean myPrototypeBean() {return new MyPrototypeBean();
}
3. Request(请求)

解释:每次 HTTP 请求都会创建一个新的 Bean 实例,并且该实例仅在当前 HTTP 请求内有效。这通常用于 Web 应用程序中,与
Servlet 请求的生命周期相关联。

注意:要使用请求作用域,你需要在一个 Web 环境中,并且 Spring 的 DispatcherServlet 正在运行。

Demo(假设在 Web 环境中):

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyRequestBean myRequestBean() {return new MyRequestBean();
}
4. Session(会话)

解释:每个 HTTP 会话都会创建一个新的 Bean 实例,且该实例仅在当前会话内有效。这也适用于 Web 应用程序。

Demo(假设在 Web 环境中):

@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public MySessionBean mySessionBean() {return new MySessionBean();
}
5. Application(应用)

解释:在 ServletContext 的生命周期内,每个 Bean 都只有一个实例。这通常用于存储跨多个用户会话的共享数据。但是,请注意,Spring Framework 本身并没有直接提供名为“Application”的内置作用域。这通常是通过在 ServletContext 中直接存储数据或使用 @ServletContextAttribute 注解来实现的。

Demo:由于 Spring 没有直接提供“Application”作用域,这里不展示具体的 Bean 定义,但你可以通过实现自己的 Scope 接口或使用 ServletContextListener 来管理跨会话的数据。

6. WebSocket(WebSocket 会话)

解释:对于使用 WebSocket 的应用程序,Spring 4.2 引入了 WebSocket 会话作用域。这允许你将 Bean 的生命周期与 WebSocket 会话绑定。

Demo:WebSocket 会话作用域的使用依赖于 Spring 的 WebSocket 支持,并且不常见于所有应用程序。因此,这里不提供具体的 Demo,但你可以查看 Spring WebSocket 文档以获取更多信息。

引申

在Spring框架中,当你配置一个Bean的作用域为请求(WebApplicationContext.SCOPE_REQUEST)、会话(WebApplicationContext.SCOPE_SESSION)或其他非单例作用域时,并且你希望将这个Bean注入到一个单例Bean中时,你会遇到一个问题:单例Bean的生命周期与请求/会话Bean的生命周期不一致。为了解决这个问题,Spring引入了作用域代理(Scoped Proxy)的概念。

proxyMode = ScopedProxyMode.TARGET_CLASS 是配置作用域代理的一种方式,它告诉Spring为这个Bean创建一个代理对象,而不是直接创建Bean的实例。这个代理对象将负责在每次需要时获取目标Bean的实例,从而实现了作用域的隔离。

具体来说,ScopedProxyMode.TARGET_CLASS 使用CGLIB库来创建目标类的子类作为代理。这意味着代理对象可以无缝地替代目标类对象,而不需要实现额外的接口(与 ScopedProxyMode.INTERFACES 不同,后者要求目标类实现至少一个接口)。

示例
假设你有一个会话作用域的Bean,你希望将其注入到一个单例Bean中:

@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public MySessionBean mySessionBean() {return new MySessionBean();
}@Service
public class MySingletonService {@Autowiredprivate MySessionBean mySessionBean; // 这里注入的是代理对象public void doSomething() {// 在这里调用mySessionBean的方法时,实际上是通过代理对象来访问当前会话的MySessionBean实例mySessionBean.doSomethingInSessionScope();}
}

@Lazy

解释:

@Lazy 注解用于指示 Spring 容器在初始化时不立即创建该 Bean 的实例,而是在首次使用时才创建。既延时加载。

Demo Code:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;@Configuration
public class AppConfig {@Bean@Lazypublic MyLazyBean myLazyBean() {return new MyLazyBean();}
}class MyLazyBean {// Lazy initialized bean
}

更深度使用:

@Lazy 可以与 @Autowired 结合使用,但需要注意,当使用 @Autowired 注入 @Lazy 标注的 Bean
时,默认行为可能会因 Spring 版本而异(可能需要额外的设置或注解)。

@Conditional

解释:

@Conditional 注解用于条件化地创建 Bean。它允许基于满足特定条件的情况下来注册 Bean。通常与自定义的 Condition
实现类一起使用。

Demo Code 自定义一个Condition

为了写一个自定义@Conditional的demo,我们需要定义一个实现org.springframework.context.annotation.Condition接口的类,并在一个配置类中使用@Conditional注解来引用这个条件类。下面是一个简单的示例,其中我们将基于一个系统属性来决定是否创建某个Bean。

首先,我们定义一个条件类OnPropertyCondition,它检查系统属性中是否存在某个特定的键:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;public class OnPropertyCondition implements Condition {private static final String PROPERTY_NAME = "myapp.feature.enabled";@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();// 检查系统属性或环境变量中是否存在该属性,并且其值为trueString property = env.getProperty(PROPERTY_NAME);return Boolean.TRUE.toString().equals(property);}
}

然后,我们创建一个配置类,使用@Conditional注解来引用我们的条件类,并根据条件决定是否创建Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Conditional;@Configuration
public class ConditionalConfig {@Bean@Conditional(OnPropertyCondition.class)public FeatureBean featureBean() {return new FeatureBean();}// FeatureBean 的实现public static class FeatureBean {// 实现细节public void doSomething() {System.out.println("Feature is enabled and doing something...");}}
}

@Import

@Import 注解在 Spring
框架中用于导入其他配置类,使得你可以在一个配置类中组合和重用多个配置类。这对于模块化配置特别有用,因为它允许你将配置分散到多个类中,然后在需要的地方通过
@Import 注解将它们组合在一起。

详解

用途:

将其他配置类导入到当前配置类中,以便重用它们的 @Bean 定义、@ComponentScan 扫描路径等。

位置:

通常用于 @Configuration 注解的类上。

参数:

@Import 可以直接指定要导入的配置类(Class 类型)。 也可以指定 ImportSelector 或
ImportBeanDefinitionRegistrar 接口的实现类,以实现更复杂的导入逻辑。 注意:当使用 @Import
导入配置类时,这些配置类中定义的 Bean 也会被 Spring 容器管理,就像它们在当前配置类中定义的一样。

使用 Demo

假设我们有两个配置类,DatabaseConfig 和 SecurityConfig,我们想要在一个主配置类 AppConfig
中将它们都导入。

DatabaseConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DatabaseConfig {@Beanpublic DataSource dataSource() {// 创建并返回 DataSource 实例return new DataSource(); // 注意:这里应该是实际的 DataSource 实现,这里只是示例}
}

SecurityConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SecurityConfig {@Beanpublic SecurityManager securityManager() {// 创建并返回 SecurityManager 实例return new SecurityManager(); // 注意:这里应该是实际的安全管理器实现,这里只是示例}
}

AppConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class AppConfig {// 这里不需要定义任何 Bean,因为所有的 Bean 都已经在 DatabaseConfig 和 SecurityConfig 中定义了// AppConfig 仅仅是一个组合配置类,它通过 @Import 注解导入了其他配置类
}

相关文章:

springboot开发的常用注解总结-配置组件类注解

Spring Boot 提供了许多注解,这些注解大大简化了 Spring 应用的配置和开发过程。以下是一些常见的 Spring Boot注解及其作用。 目录 配置组件类 (Configure Component )Configuration解释:Demo Code:更深度使用&#x…...

DataX 最新版本安装部署

1、下载 git clone gitgithub.com:alibaba/DataX.git 2、打包 mvn -U clean package assembly:assembly -Dmaven.test.skiptrue...

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护,更多的会想到阿里的sentinel,手段丰富,应用简单。sentinel的限流、降级、熔断,可以自己去试一下,sentinel主要通过配置实现功能,不难。sentinel的简介放…...

从核心到边界:六边形、洋葱与COLA架构的深度解析

文章目录 1 引言2 软件架构3 架构分类4 典型的应用架构4.1 分层架构4.2 CQRS4.3 六边形架构4.4 洋葱架构4.5 DDD 5 COLA架构设计5.1 分层设计5.2 扩展设计5.3 规范设计5.3.1 组件规范5.3.2 包规范5.3.3 命名规范 6 COLA架构总览7 小结 1 引言 软件的首要技术使命:管…...

04-Fastjson反序列化漏洞

免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…...

ABC365(A-D)未补

A - Leap Year(模拟) 题意:给定一个数字n,如果n不是4的倍数,输出365;如果n是4的倍数但不是100的倍数,输出366;如果n是100的倍数但不是400的倍数,输出365;如果…...

Python用png生成不同尺寸的图标

Kimi生成 from PIL import Imagedef generate_icon(source_image_path, output_image_path, size):with Image.open(source_image_path) as img:# 转换图片为RGBA模式,确保有透明通道if img.mode ! RGBA:img img.convert(RGBA)# 调整图片大小到指定尺寸img img.r…...

1688中国站获得工厂档案信息 API

公共参数 名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...

定时任务框架 xxl-job

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

C/C++关键字大全

目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…...

ROS2 Linux Mint 22 安装教程

前言: 本教程在Linux系统上使用。 一、linux安装 移动硬盘安装linux:[LinuxToGo教程]把ubuntu装进移动固态,随时随用以下是我建议安装linux mint版本的清单: 图吧工具箱:https://www.tbtool.cn/linux mint: https://…...

快速将网站从HTTP升级为HTTPS

在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…...

Qt程序移植至Arm开发板

目录 1.工具准备: 系统调试工具SecureCRT 虚拟机安装linux(Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2)交叉编译工具链配置 2.编译Qt工程: 2.0 交叉编译 依赖库源码,生成动…...

删除分区 全局索引 drop partition global index Statistics变化

1.不一定unusable,可以先删除data (index 再删除过程中会更新结构)再drop/truncate. ---------------------- CREATE TABLE interval_sale ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE ) PARTITION BY RANGE (time_i…...

git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支

文章目录 1、git回退未commit2、git回退已commit3、git回退已push的代码3.1 直接丢弃某一次的push3.2 撤销push后,不丢弃改动,重新修改后要再次push 4、合并某一次commit到另一个分支 整理几个工作上遇到的git问题。 1、git回退未commit git回退未comm…...

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…...

程序员找工作之操作系统面试题总结分析

程序员在找工作面试时,操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析: 1. 核心硬件与体系结构 微机的核心部件:询问微机硬件系统中最核心的部件是什么(CPU)。处理机…...

TypeScript 迭代器和生成器详解

目录 迭代器(Iterators) 生成器(Generators) 使用场景 for..of vs. for..in 语句 for..of 循环 for..in 循环 区别总结 注意事项 总结 在 TypeScript 中,迭代器(Iterators)和生成器&am…...

echarts 极坐标柱状图 如何定义柱子颜色

目录 echarts 极坐标柱状图 如何定义柱子颜色问题描述方式一 在 series 数组中定义颜色方式二 通过 colorBy 和 color 属性配合使用 echarts 极坐标柱状图 如何定义柱子颜色 本文将分享在使用 echarts 的 极坐标柱状图 时,如何自定义柱子的颜色。问题本身并不难解决…...

JavaScript模块化

JavaScript模块化 一、CommonJS规范1、在node环境下的模块化导入、导出 2、浏览器环境下使用模块化browserify编译js 二、ES6模块化规范1、在浏览器端的定义和使用2、在node环境下简单使用方式一:方式二: 3、导出数据4、导入数据5、数据引用问题 一、Com…...

文件包含漏洞Tomato靶机渗透_详解

一、导入靶机 将下载好的靶机拖入到VMware中,填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段,发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…...

湖北汽车工业学院-高等数学考纲

湖北汽车工业学院2024年普通专升本考试的《高等数学》考试大纲已经公布。考试形式为闭卷笔试,满分100分,考试时间为90分钟。考试内容主要包括以下几个部分: 1. **函数、极限、连续**: 涉及函数概念、表示法、有界性、周期性、奇偶…...

Linux:Xshell相关配置及前期准备

一、Linux的环境安装 1、裸机安装或者是双系统 2、虚拟机的安装 3、云服务器(推荐)——>安装简单,维护成本低,学习效果好,仿真性高(可多人一起用一个云服务器) 1.1 购买云服务器 使用云服…...

模型 正态分布(通俗解读)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。随机世界的规律,大自然里的钟形曲线。 1 正态分布的应用 1.1 质量管理之六西格玛 六西格玛是一种旨在通过识别和消除缺陷原因来提高制造过程或业务流程质量的管理策略。我们先来了解下六…...

安装了Vue-pdf后,打包文件多出了worker.js和worker.js.gz

解决方式: 修改node_modules/worker-loader/dist/index文件 将 const filename _loaderUtils2.default.interpolateName(this, options.name || 中的 js/[hash].worker.js,更改为 static/js/[hash].worker.js...

使用excel生成国际化多语言js文件的脚本

1、创建一个空文件夹 2、终端 cnpm install xlsx3、在文件夹创建一个index.js // 导入 Node.js 内置的 fs 模块 const fs = require(fs); // 导入 xlsx 模块,用于处理 Excel 文件 const XLSX = require(xlsx);// 读取 Excel 文件 function readExcelFile(filePath) {const …...

【蝉联】摩斯再次获得“中国隐私计算市场份额第一”

蝉联第一 8月2日,全球领先的IT市场研究和咨询公司IDC发布了《中国隐私计算平台厂商市场份额,2023》报告。蚂蚁集团凭借商用隐私计算平台摩斯(MORSE),以 35.3%的市场份额蝉联第一。 2023年,中国隐私计算平台…...

安装 qcloud-python-sts 失败 提示 gbk codecs decode byte 应该如何解决

安装 qcloud-python-sts 失败 提示 gbk codecs decode byte 应该如何解决 解决方案: 将windows 修改为utf-8编码格式 解决步骤如下: 1. 进入控制台 2. 点击区域 4. 点击管理 4.勾选UTF-8 5.重启系统即可...

mv:自动对焦代码

try:# The camera will now focus on whatever is in front of it.sensor.ioctl(sensor.IOCTL_TRIGGER_AUTO_FOCUS) except:raise (Exception("Auto focus is not supported by your sensor/board combination."))...

【C++】数组案例 五只小猪称体重

题目:给出物质小猪体重,找出最大的体重的值并打印 思路:利用菽粟写入五只小猪的体重,让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比,若是大就继续赋值给这个变量,若是小则不赋值…...

哪个网站做任务可以赚钱/免费网站优化排名

背景 Windows Embedded CE 6.0 R3已经包含了Silverlight for Embedded的功能,开发人员可以使用WPF的方式来开发Wince应用程序。关于Silverlight for Embedded,我之前写了篇介绍性的文章,可以参考 User Interface Technologies for Windows Em…...

直接在原备案号下增加新网站/淘宝培训

如下代码,输入评论,如果评论中含有敏感词则更换成*号,否则正常输入。 li ["老师", "你好", "333", "4444"]word str(input(>>>))for i in li: if i in word: num len(i) …...

wordpress升级后等待/如何成为百度广告代理商

类面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为&…...

织梦做商城类网站好做吗/百度认证有什么用

《计算机应用基础作业4》由会员分享,可在线阅读,更多相关《计算机应用基础作业4(13页珍藏版)》请在人人文库网上搜索。1、下列关于Word中分栏的说法不正确的是________。选择一项:a. 分栏数可以调整 b. 各栏之间的间距不是固定的 c. 各栏的宽…...

网站建设的主要职责/东莞产品网络推广

是唯一有伞,仍然淋湿的人吗? 向来缘浅,奈何情深? 彼年豆蔻,谁许谁地老天荒。 如花美眷,似水流年。 有些事,一转身就是一辈子。 年轻时我们放弃,以为那只是一段感情,后来才…...

太原网站建设-中国互联/营销培训课程2022

-- Tips:聚合和排序-- 一、对表进行聚合查询 --  1.聚合函数--    (1)5 个常用函数:--      ①COUNT:计算表中的记录(行)数。--      ②SUM:计算表中数值…...