@Configuration
类上的 @Configuration 注解:标识 "配置类" @Configuration 是 Spring 的核心注解,作用是 告诉 Spring:这个类是 "配置类",里面定义了项目的 "Bean(组件)" 和 "配置规则"。
没有 @Configuration,下面的 @Bean 注解会失效(Spring 不会识别和创建对应的组件); 配置类的本质是 "Bean 的工厂",Spring 启动时会扫描带有 @Configuration 的类,执行里面的 @Bean 方法,将返回的对象存入 "Spring 容器"(相当于一个全局的组件仓库)。
@Bean 注解:
注册自定义 Bean 到 Spring 容器
@Bean 注解用在方法上,作用是 告诉 Spring:执行这个方法,将返回的对象作为 "Bean" 存入 Spring 容器,后续可通过 @Autowired 注入使用。
方法名默认是 Bean 的名称(比如 mqttClientFactory() 对应的 Bean 名称是 mqttClientFactory); 适用于:第三方组件(如 MQTT 连接工厂)或自定义组件,无法通过 @Service/@Component 注解标识时,用 @Bean 手动注册。
@value
@Value 是 Spring 的 "属性注入" 注解,作用是 将配置文件(如 application.yml)中的值,自动赋值给当前类 语法:{配置项路径},比如 {mqtt.broker-url} 对应 yml 中 mqtt 节点下的 broker-url; 好处:无需手动读取配置文件(比如用 Properties 类加载),Spring 自动完成,且便于统一管理配置(修改时只改 yml,不用改代码)。
java
@Value("${mqtt.broker-url}")
private String brokerUrl; // 读取 application.yml 中 mqtt.broker-url 的值
@Value("${mqtt.client-id}")
private String clientId; // 读取 mqtt.client-id
@Value("${mqtt.topic}")
private String topic; // 读取 mqtt.topic
对应该类: 通过 @Value 拿到 EMQX 的连接地址、客户端 ID、订阅主题,后续用这些值配置 MQTT 连接。
@ConfigurationProperties+bean对象实现属性配置
@Value,它在读取单个值时很方便。但如果配置文件里有几十个相关的属性(比如数据库的 url, username, password, pool-size),用几十个 @Value 会很乱。所以我们可也以使用另一个作用于类上的注解
@ConfigurationProperties(prefix = "my.db")+bean对象(如下面使用@Component)
- 作用:将一组配置项批量映射到一个 Java 类中,类型安全,有代码提示。
java
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "pig")
@Component
public class Pig {
Integer id;
Integer age;
String name;
}
在其上用@ConfigurationProperties(prefix = "pig")指定前缀 这样你就可以使用这个前缀在配置文件中去为这个对象的属性赋值。
pig.id= 123 pig.name= amaidou pig.age= 18
@Autowired 注解:依赖注入(DI)
@Autowired 是 Spring 核心的 "依赖注入" 注解,作用是 自动从 Spring 容器中找到对应的 "Bean(组件)",并注入到当前类中------ 不用手动 new InfluxService() 创建对象。
前提:InfluxService、RedisService 等类必须被 Spring 识别为 Bean(比如类上有 @Service 注解); 好处:解耦(当前类不用关心这些服务是怎么创建的)、便于测试(可替换为模拟服务)、统一管理对象生命周期(Spring 负责创建和销毁)。
@Autowired
private InfluxService influxService; // 注入 InfluxDB 操作服务
@Autowired
private RedisService redisService; // 注入 Redis 操作服务
@Autowired
private AlarmService alarmService; // 注入告警检查服务”
Spring 常用 stereotype 注解
在软件工程和 UML(统一建模语言)中,Stereotype(构造型) 的意思是:"给现有的模型元素打上特定的标签,以表明它具有某种特殊的语义或用途。"
下面介绍结果常用的stereotype 注解
| 注解 | 作用场景 | 示例 |
|---|---|---|
@Component |
通用组件(无明确分层) | 工具类、通用处理器 |
@Service |
业务逻辑层(Service) | 操作数据库 / Redis 的业务服务 |
@Controller |
控制层(Web 接口) | 接收 HTTP 请求的 Controller |
@Repository |
数据访问层(DAO) | 操作 MySQL 的 Mapper/Repository |
1、关键语法:组件扫描 Spring Boot 默认扫描 主启动类所在包及其子包 中的 stereotype 注解。如果 RedisService 和主启动类不在同一包下,需要手动在主启动类加 @ComponentScan(basePackages = "com.xxx.service") 指定扫描路径,否则 Spring 无法识别该 Bean。
2、上面的结果注解本质上都是 @Component 的"别名"或"特化版"。
从技术实现角度(让 Spring 能扫描到并创建对象)完成可以直接用 @Component ,@Service, @Controller, @Repository 内部其实都标注了 @Component。但是,使用特定的 Stereotype 会更加清晰。
@RestController
在现代 Spring Boot 开发中,你还会经常见到在controller层的类上有: @RestController。
它 = @Controller + @ResponseBody。
区别
-
@Controller:告诉 Spring 这是 Web 控制层类,负责接收 HTTP 请求;( -
@RestController:通常用于返回 JSON/XML 数据(前后端分离的 RESTful API 接口)。
这是因为其中的:@ResponseBody作用是自动将方法返回值(如 AjaxResult)转为 JSON 格式响应给前端(无需手动处理 JSON 转换)。
@RequestMapping({"/api/host"})
@RequestMapping({"/api/host"}):请求路径映射
作用:指定当前 Controller 所有接口的 "基础路径",前端访问时需拼接该路径; 示例:@GetMapping("/list") 对应的完整访问路径是 http://localhost:8080/api/host/list; 语法细节: 支持多个路径:@RequestMapping({"/api/host", "/api/device-host"})(两个路径都能访问);
HTTP 请求方法注解
下面我们介绍一些http的请求方法注解(@GetMapping,@PostMapping,@DeleteMapping)的作用,对应http方法,前端访问方式;
(@GetMapping/@PostMapping/@DeleteMapping)
| 注解 | 作用 | 对应 HTTP 方法 | 前端访问方式 |
|---|---|---|---|
@GetMapping("/list") |
处理查询请求(获取主机列表) | GET | 浏览器访问、前端 axios.get() |
@PostMapping("/add") |
处理新增请求(添加主机) | POST | 前端 axios.post()(传 JSON) |
@DeleteMapping("/delete") |
处理删除请求(删除主机) | DELETE | 前端 axios.delete() |
进阶
参数接收与数据绑定
前面我们介绍了 @GetMapping 等 注解标明某方法对应处理哪个路径的请求;
我们再介绍在Controller方法上获取前端各种数据的注解(卸载参数上);
有@PathVariable,@RequestParam,@RequestBody
-
变量。
- 例:
/users/{id}->public User get(@PathVariable Long id)
- 例:
-
@RequestParam:获取查询参数。
- 例:
/users?name=Tom->public User get(@RequestParam String name)
- 例:
-
@RequestBody非常重要!
获取 POST/PUT 请求体中的 JSON 数据,并自动转换为 Java 对象。
- 例:前端传
{ "name": "Tom", "age": 18 }->public void add(@RequestBody User user)
- 例:前端传
数据校验
前端传过来的数据可能是空的、格式错误的(比如年龄是 -5,邮箱没有 @)。你不能在每个 Service 里写一堆 if (name == null)。
-
@Valid/@Validated:放在@RequestBody前面,开启校验。 -
校验注解 :
@NotNull,@Size,@Email,@Min,@Max等(放在 DTO 对象的字段上)。 -
缺失后果:脏数据进入数据库,导致业务逻辑错误或系统崩溃。
事务管理
这是企业级开发的生命线。比如"转账"操作:A 扣钱,B 加钱。如果 A 扣钱成功了,B 加钱时报错了,怎么办?必须回滚!
-
@Transactional核心注解- 作用:加在 Service 层方法上。如果方法内发生运行时异常,Spring 会自动回滚数据库的所有操作,保证数据一致性。
-
缺失后果:数据不一致,出现"钱扣了没到账"等严重事故。
总结
1、本文介绍了Springboot的几个配置说明:@Configuration(标识配置类,配置类本质是Bean的工程);@Bean(用在方法上,自定义组件),@value(将配置文件中的值诸如当前属性),也可以使用 @ConfigurationProperties(prefix = "my.db") 作用于类,将多个配置文件中的值一起注入;@Autowired(将依赖(bean对象)注入当前类);
2、对于类注册为bean:我们介绍了Spring 常用 stereotype 注解(@Componet:通用组件(使类变成bean),@Service:业务逻辑层@Controller:控制层;@Rrpository数据访问层,dao层),并讨论了细分而不是统一用@Componet的原因。
3、对于数据返回:我们介绍了@RestController(返回 JSON/XML 数据),并用之对比了@Controller;
又介绍了:@RequestMapping(指定当前 Controller 所有接口的 "基础路径");
4、对于指定请求路径的处理:我们介绍了一些http的请求方法注解(@GetMapping,@PostMapping,@DeleteMapping)的作用,对应http方法,前端访问方式;
5、除此我们还有再介绍:
-
参数接收:
@PathVariable,@RequestParam,@RequestBody(必会)。 -
数据校验:
@Valid,@NotNull等。 -
事务控制:
@Transactional(必会)。等;