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

Spring Boot 的核心注解

一、引言

Spring Boot 作为一种流行的 Java 开发框架,以其简洁高效的开发方式受到广泛关注。其中,核心注解在 Spring Boot 应用的开发中起着至关重要的作用。理解这些注解的含义和用法,对于充分发挥 Spring Boot 的优势至关重要。本文将深入剖析 Spring Boot 的核心注解。

二、@SpringBootApplication 注解

(一)功能概述

  1. 组合注解
    • @SpringBootApplication 是一个组合注解,它包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的功能。
  2. 配置应用
    • 该注解用于标识一个 Spring Boot 应用的主配置类,告诉 Spring Boot 框架如何进行自动配置和组件扫描。

(二)用法详解

  1. 定义主类
    • 在 Spring Boot 应用中,通常会创建一个主类,并使用 @SpringBootApplication 注解进行标识。这个主类通常包含一个 main 方法,用于启动应用程序。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

  1. 自动配置

    • @SpringBootApplication 注解会触发 Spring Boot 的自动配置机制。Spring Boot 会根据项目中引入的依赖和类路径中的内容,自动配置应用程序所需的各种组件和配置。
  2. 组件扫描

    • 该注解还会启动组件扫描功能,自动扫描主类所在的包及其子包中的所有带有 @Component、@Service、@Repository、@Controller 等注解的类,并将它们注册为 Spring 容器中的 Bean。

三、@Configuration 注解

(一)功能介绍

  1. 定义配置类
    • @Configuration 注解用于标识一个类为 Spring 的配置类。在配置类中,可以使用 @Bean 注解定义 Bean,并进行各种配置。
  2. 替代 XML 配置
    • 随着 Spring 的发展,越来越多的开发者倾向于使用基于 Java 的配置方式,而 @Configuration 注解就是实现这种配置方式的关键。

(二)用法示例

  1. 定义 Bean
    • 在配置类中,可以使用 @Bean 注解定义 Bean。例如,定义一个名为 myService 的 Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}

  1. 导入其他配置类
    • 可以使用 @Import 注解导入其他配置类,实现配置的模块化。例如:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@Import(AnotherConfig.class)
public class MainConfig {
}

四、@EnableAutoConfiguration 注解

(一)自动配置原理

  1. 依赖分析
    • @EnableAutoConfiguration 注解会根据项目中引入的依赖,自动配置应用程序所需的各种组件。例如,如果项目中引入了 Spring Data JPA 的依赖,Spring Boot 会自动配置数据库连接和 JPA 相关的组件。
  2. 排除特定自动配置
    • 有时候,可能需要排除某些自动配置。可以使用 @SpringBootApplication 的 exclude 属性来排除特定的自动配置类。例如:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

(二)使用场景

  1. 快速开发
    • 在快速开发过程中,@EnableAutoConfiguration 注解可以大大减少配置的工作量,提高开发效率。
  2. 集成第三方库
    • 当集成第三方库时,Spring Boot 的自动配置功能可以自动配置与该库相关的组件,使得集成更加简单快捷。

五、@ComponentScan 注解

(一)扫描机制

  1. 包扫描
    • @ComponentScan 注解用于指定 Spring 容器进行组件扫描的包路径。默认情况下,它会扫描主类所在的包及其子包中的所有带有 @Component、@Service、@Repository、@Controller 等注解的类,并将它们注册为 Spring 容器中的 Bean。
  2. 自定义扫描路径
    • 可以通过 basePackages 属性指定自定义的扫描路径。例如:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = {"com.example.myapp.service", "com.example.myapp.repository"})
public class AppConfig {
}

(二)与其他注解的配合

  1. 与 @Controller、@Service、@Repository 等注解配合
    • @ComponentScan 注解与这些注解配合使用,可以实现自动注册 Bean 的功能。例如,当一个类被标注为 @Service 时,@ComponentScan 注解会将其扫描并注册为 Spring 容器中的一个服务 Bean。
  2. 与 @Configuration 注解配合
    • 在配置类中,通常会使用 @ComponentScan 注解来指定组件扫描的范围,以便将其他带有注解的类注册为 Bean。

六、@Autowired 注解

(一)依赖注入原理

  1. 自动装配
    • @Autowired 注解用于实现依赖注入。当一个类的字段、构造函数或方法被标注为 @Autowired 时,Spring 容器会自动将匹配的 Bean 注入到该字段、构造函数或方法中。
  2. 按类型匹配
    • Spring 容器会根据 Bean 的类型进行匹配。如果有多个相同类型的 Bean,还可以使用 @Qualifier 注解指定具体要注入的 Bean 的名称。

(二)用法示例

  1. 字段注入
    • 在类的字段上使用 @Autowired 注解,实现字段的自动注入。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate MyRepository myRepository;public void doSomething() {// 使用 myRepository}
}

  1. 构造函数注入
    • 在构造函数上使用 @Autowired 注解,实现构造函数的自动注入。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyRepository myRepository;@Autowiredpublic MyService(MyRepository myRepository) {this.myRepository = myRepository;}public void doSomething() {// 使用 myRepository}
}

  1. 方法注入
    • 在方法上使用 @Autowired 注解,实现方法的自动注入。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private MyRepository myRepository;@Autowiredpublic void setMyRepository(MyRepository myRepository) {this.myRepository = myRepository;}public void doSomething() {// 使用 myRepository}
}

七、@Value 注解

(一)属性注入

  1. 从配置文件中获取值
    • @Value 注解可以用于从配置文件(如 application.properties 或 application.yml)中获取属性值,并注入到字段、构造函数参数或方法参数中。
  2. 表达式支持
    • 还可以使用 SpEL(Spring Expression Language)表达式来获取更复杂的值。例如:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class MyService {@Value("${my.property}")private String myProperty;@Value("#{T(java.lang.Math).random() * 100}")private int randomNumber;public void doSomething() {// 使用 myProperty 和 randomNumber}
}

(二)使用场景

  1. 动态配置
    • 在需要根据不同环境进行动态配置的情况下,@Value 注解非常有用。可以将配置文件中的属性值注入到 Bean 中,实现灵活的配置。
  2. 参数化构造函数
    • 可以在构造函数参数上使用 @Value 注解,实现参数化的构造函数,根据配置文件中的值来创建 Bean。

八、@RequestMapping 注解

(一)处理 HTTP 请求

  1. 映射请求路径
    • @RequestMapping 注解用于将一个方法映射到特定的 HTTP 请求路径上。它可以用在类级别和方法级别上,用于定义控制器类和方法的请求映射。
  2. 支持多种 HTTP 方法
    • 可以通过 value 属性指定请求路径,通过 method 属性指定支持的 HTTP 方法(如 GET、POST、PUT、DELETE 等)。

(二)用法示例

  1. 类级别映射
    • 在控制器类上使用 @RequestMapping 注解,定义类级别的请求映射。例如:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class MyController {// 方法级别的请求映射将在此基础上进行
}

  1. 方法级别映射
    • 在控制器方法上使用 @RequestMapping 注解,定义具体的请求映射。例如:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class MyController {@RequestMapping(value = "/users", method = RequestMethod.GET)public List<User> getUsers() {// 返回用户列表}
}

九、@RestController 注解

(一)构建 RESTful API

  1. 标识控制器
    • @RestController 注解是 @Controller 和 @ResponseBody 的组合注解。它用于标识一个控制器类,该类中的方法将返回 JSON、XML 或其他格式的响应数据,用于构建 RESTful API。
  2. 自动序列化响应数据
    • 当一个方法被标注为 @RestController 注解的类中的方法返回一个对象时,Spring Boot 会自动将该对象序列化为 JSON 或其他格式的响应数据,并返回给客户端。

(二)与其他注解的配合

  1. 与 @RequestMapping 注解配合
    • @RestController 注解通常与 @RequestMapping 注解一起使用,用于定义 RESTful API 的请求映射和响应数据。
  2. 与 @Service、@Repository 等注解配合
    • 在构建复杂的应用程序时,@RestController 注解可以与其他注解(如 @Service、@Repository)配合使用,实现业务逻辑和数据访问的分离。

十、实际案例分析

(一)案例背景

假设有一个简单的博客应用,需要实现文章的管理功能,包括创建、读取、更新和删除文章。

(二)技术选型

  1. 使用 Spring Boot 构建应用
    • 选择 Spring Boot 作为开发框架,利用其快速开发、自动配置等优势。
  2. 数据库选择
    • 选择一个关系型数据库(如 MySQL)来存储文章数据。
  3. 前端框架选择
    • 可以选择一个前端框架(如 Vue.js 或 React)来构建用户界面,与后端的 Spring Boot 应用进行交互。

(三)核心注解的应用

  1. @SpringBootApplication 注解
    • 在主类上使用 @SpringBootApplication 注解,标识这是一个 Spring Boot 应用的主配置类。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {SpringApplication.run(BlogApplication.class, args);}
}

  1. @Configuration 注解
    • 创建一个配置类,使用 @Configuration 注解标识。在这个配置类中,可以定义 Bean 和进行其他配置。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;@Configuration
public class AppConfig {@Beanpublic JdbcTemplate jdbcTemplate() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/blogdb");dataSource.setUsername("root");dataSource.setPassword("password");return new JdbcTemplate(dataSource);}
}

  1. @Autowired 注解
    • 在服务类和控制器类中,使用 @Autowired 注解进行依赖注入。例如,在文章服务类中注入 JdbcTemplate:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ArticleService {private final JdbcTemplate jdbcTemplate;@Autowiredpublic ArticleService(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void createArticle(Article article) {// 使用 jdbcTemplate 执行数据库插入操作}public Article getArticleById(int id) {// 使用 jdbcTemplate 执行数据库查询操作}// 其他方法
}

  1. @RequestMapping 注解和 @RestController 注解
    • 在控制器类中,使用 @RequestMapping 注解和 @RestController 注解定义 RESTful API 的请求映射。例如:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/articles")
public class ArticleController {private final ArticleService articleService;@Autowiredpublic ArticleController(ArticleService articleService) {this.articleService = articleService;}@RequestMapping(method = RequestMethod.POST)public void createArticle(Article article) {articleService.createArticle(article);}@RequestMapping(value = "/{id}", method = RequestMethod.GET)public Article getArticleById(@PathVariable int id) {return articleService.getArticleById(id);}// 其他方法
}

(四)效果评估

  1. 开发效率
    • 通过使用 Spring Boot 的核心注解,大大提高了开发效率。自动配置和依赖注入功能减少了手动配置的工作量,使得开发过程更加快捷。
  2. 代码可读性和可维护性
    • 注解的使用使得代码更加清晰易读,易于理解和维护。例如,通过 @RequestMapping 注解和 @RestController 注解,可以很容易地看出控制器类的作用和请求映射关系。
  3. 功能实现
    • 成功实现了博客应用的文章管理功能,包括创建、读取、更新和删除文章。通过 RESTful API 的方式,使得前端可以方便地与后端进行交互。

十一、总结

Spring Boot 的核心注解在开发过程中起着至关重要的作用。@SpringBootApplication、@Configuration、@EnableAutoConfiguration、@ComponentScan、@Autowired、@Value、@RequestMapping 和 @RestController 等注解分别在应用的配置、自动配置、组件扫描、依赖注入、属性注入、请求映射和构建 RESTful API 等方面发挥着重要作用。通过深入理解这些注解的功能和用法,并结合实际案例进行应用,可以提高开发效率,增强代码的可读性和可维护性,实现高效的 Java 开发。

相关文章:

Spring Boot 的核心注解

一、引言 Spring Boot 作为一种流行的 Java 开发框架&#xff0c;以其简洁高效的开发方式受到广泛关注。其中&#xff0c;核心注解在 Spring Boot 应用的开发中起着至关重要的作用。理解这些注解的含义和用法&#xff0c;对于充分发挥 Spring Boot 的优势至关重要。本文将深入剖…...

蓝桥杯备考——算法

一、排序 冒泡排序、选择排序、插入排序、 快速排序、归并排序、桶排序 二、枚举 三、二分查找与二分答案 四、搜索&#xff08;DFS&#xff09; DFS&#xff08;DFS基础、回溯、剪枝、记忆化&#xff09; 1.DFS算法&#xff08;深度优先搜索算法&#xff09; 深度优先搜…...

MutationObserver与IntersectionObserver的区别

今天主要是分享一下MutationObserver和IntersectionObserver的区别&#xff0c;希望对大家有帮助! MutationObserver 和 IntersectionObserver 的区别 MutationObserver 作用&#xff1a;用于监听 DOM 树的变动&#xff0c;包括&#xff1a;元素的属性、子元素列表或节点文本的…...

生产与配置

1.鲁滨孙克苏鲁经济 鲁滨孙克苏鲁经济是一种非常简单的自给自足的经济&#xff0c;劳动时间与休息时间总和为总的时间。 即 摘椰子的数量为劳动时间的函数 由于鲁滨孙喜欢椰子&#xff0c;厌恶劳动时间&#xff0c;因此无差异曲线表现为厌恶品的形态。 根据无差异曲线和生…...

Android Kotlin Flow 冷流 热流

在 Android 开发中&#xff0c;Flow 是 Kotlin 协程库的一部分&#xff0c;用于处理异步数据流的一个组件。本质上&#xff0c;Flow 是一个能够异步生产多个值的数据流&#xff0c;与 suspend 函数返回单个值的模式相对应。Flow 更类似于 RxJava 中的 Observable&#xff0c;但…...

订单日记助力“实峰科技”提升业务效率

感谢北京实峰科技有限公司选择使用订单日记&#xff01; 北京实峰科技有限公司&#xff0c;成立于2022年&#xff0c;位于北京市石景区&#xff0c;是一家以从事生产、销售微特电机、输配电及控制设备等业务为主的企业。 在业务不断壮大的过程中&#xff0c;想使用一种既能提…...

如何安装和配置JDK17

教程目录 零、引言1、新特性概览2、性能优化3、安全性增强4、其他改进5、总结 一、下载安装二、环境配置三、测试验证 零、引言 JDK 17&#xff08;Java Development Kit 17&#xff09;是Java平台的一个重要版本&#xff0c;它带来了许多新特性和改进&#xff0c;进一步提升了…...

智能化温室大棚控制系统设计(论文+源码)

1 系统的功能及方案设计 本次智能化温室大棚控制系统的设计其系统整体结构如图2.1所示&#xff0c;整个系统在器件上包括了主控制器STC89C52&#xff0c;温湿度传感器DHT11&#xff0c;LCD1602液晶&#xff0c;继电器&#xff0c;CO2传感器&#xff0c;光敏电阻&#xff0c;按…...

面试题之---解释一下原型和原型链

实例化对象 和普调函数一样&#xff0c;只不过调用的时候要和new连用&#xff08;实例化&#xff09;&#xff0c;不然就是一个普通函数调用 function Person () {} const o1 new Person() //能得到一个空对象 const o2 Person() //什么也得不到&#xff0c;这就是普通的…...

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…...

自动驾驶革命:从特斯拉到百度,谁将主宰未来交通?

内容概要 自动驾驶技术正在经历一个前所未有的革命性变化&#xff0c;各大企业纷纷抢占这一充满潜力的新市场。以特斯拉和百度为代表的行业巨头&#xff0c;正利用各自的优势在这一技术的赛道上展开激烈竞争。特斯拉凭借其在电动汽车和自动驾驶领域的前瞻性设计与不断革新的技…...

Python __str__()方法

在Python中&#xff0c;str() 方法是一个特殊的方法&#xff08;也称为魔术方法或双下方法&#xff09;&#xff0c;它定义了当对象需要被转换为字符串表示时应该如何做。 当你尝试打印对象&#xff08;使用 print() 函数&#xff09;或将对象插入到需要字符串表示的上下文中&…...

虚拟机的安装

添加映像文件 自动或者手动分配磁盘 添加密码 创建用户 创建快照...

HCIP快速生成树 RSTP

STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;和RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树协议&#xff09;都是用于在局域网中消除环路的网络协议。 STP&#xff08;生成树协议&#xff09; 基本概念&#xff1a; ST…...

Python基础学习-05元组 tuple

目录 1、元组的定义 2、元组的切片和索引 3、元组的函数 4、二维元组 5、本节总结 1、元组的定义 • 基本上可以理解为一个不可改变的列表 • 元组没有列表那么常用&#xff0c;但是它的关键是不可改变性 • 使用() 定义一个元组 1&#xff09; T (1, 2, 3, 4, …...

vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法

1、先上个截图&#xff1a; 说明&#xff1a;拖动上面的分隔栏就可以实现&#xff0c;改变左右区域的大小。 2、上面的例子来自官网的&#xff1a; Container 布局容器 | Element Plus 3、拖动的效果来自&#xff1a; https://juejin.cn/post/7029640316999172104#heading-1…...

c++基础28函数的类型

函数的类型 基本用法例子usingfucntion 基本用法 在C中&#xff0c;函数类型是指函数的签名&#xff0c;包括返回类型、参数类型以及参数的数量。函数类型可以用来声明函数指针、函数引用或者作为模板参数。 函数也可当成一种数据类型 函数指针&#xff1a; 函数指针可以指向…...

Elasticsearch(四):query_string查询介绍

query_string查询介绍 1 概述2 基本概念3 数据准备4 query_string查询示例4.1 基本查询4.2 复杂查询解析4.3 高级过滤解析4.4 模糊查询解析4.5 高亮查询解析4.6 分页查询解析 5 总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以我的公众号“欧阳方超”&#xff0c;后续内容…...

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习&#xff0c;处处可用。 一切皆数据 Nu 管道使用结构化数据&#xff0c;你可以用同样的方式安全地选择&#xff0c;过滤和排序。停止解析字符串&#xff0c;开始解决问题。 强大的插件系统 具备强…...

Vue禁止打开控制台/前端禁止打开控制台方法/禁用F12/禁用右键

代码片段展示了如何在前端页面中禁用右键菜单、禁止文本选择、阻止特定键盘操作&#xff08;如F12键打开开发者工具&#xff09;&#xff0c;以及通过检测窗口尺寸变化来尝试阻止用户调试页面。 // 鼠标禁止右键禁止打开控制台及键盘禁用forbidden(){// 1.禁用右键菜单document…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...