【SpringBoot】常用注解 配置文件加载顺序 全局异常

文章目录

常用注解

配置类注解

@Configuration : 用于定义一个配置类 ,此类中通常包含多个@Bean方法,用于通过Java代码方式来定义Spring容器中的bean

@Bean : 在@Configuration类的方法上使用,用于定义一个具体的bean实例。当Spring容器启动时,它会执行该方法并创建和管理返回的对象作为bean

java 复制代码
@Configuration // 标记这是一个配置类,容器启动时会加载这个类中的@Bean方法。
public class AppBootConfig {
    
    @Bean(name = "stu") // 定义一个bean,其名称为"stu"。
    public Student getStudent(){
        Student stu = new Student();
        stu.setStudentName("zhangsan");
        return stu;
    }
}

属性源与绑定注解

@PropertySource : 用于加载自定义的.properties文件到Spring环境中,使得可以通过@ValueEnvironment对象访问这些属性。

@Value : 用于注入单个属性值到字段、构造函数参数或方法参数中。支持占位符语法${property.key},可以从环境变量、JVM系统属性、或由@PropertySource加载的属性文件中获取值。

@ConfigurationProperties : 用于将一组相关的属性绑定到一个Java Bean上。它可以作用于类级别,并结合prefix属性指定属性前缀,以匹配配置文件中的属性。

1、创建 smbms.yml 文件

首先,在src/main/resources目录下创建一个名 smbms.yml 的文件

yaml 复制代码
gmy:
 proId: 1001
 proCode: zhangsan
 proName: 张三

2、配置读取 YAML 文件

java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:smbms.yml") // 读取文件
@ConfigurationProperties(prefix = "gmy") // 前缀
public class AppBootConfig {
    // 写入 yml 中对应的 key
    @Value("${proId}")
    private Integer proId;
    @Value("${proCode}")
    private String proCode;
    @Value("${proName}")
    private String proName;

    @Bean("provider")
    public Provider getProvider(){
        Provider provider = new Provider();
        provider.setId(proId);
        provider.setProCode(proCode);
        provider.setProName(proName);
        return provider;
    }
}

SpringBoot 不会帮我们自动读取 smbms.yml 文件,所以需要添加 @PropertySource 注解 @PropertySource("classpath:smbms.yml")

3、配置 Controller 打印 toString() 方法

java 复制代码
@Controller
@RequestMapping("/provider")
public class ProviderController {
    @Resource
    private Provider provider;
    
    @GetMapping("/proAdd")
    @ResponseBody
    public ResultJSON providerAdd(){
        System.out.println(provider.toString());
        return ResultJSON.success();
    }
}

存在乱码问题,读取时设置编码格式:

java 复制代码
@PropertySource(value = "classpath:smbms.yml",encoding = "UTF-8") // 读取文件并设置编码格式

或者去到 IDEA 的【File】【Settings】中,将下图所示部分全部改为【UTF-8】格式

点击【Apply】,应用之后【OK】保存设置。

组件扫描与注册注解

@ComponentScan :指示Spring自动扫描指定包及其子包下的组件(如带有@Component, @Service, @Repository, @Controller等注解的类),并将它们注册为Spring应用上下文中的bean

默认情况下,会从声明该注解的类所在的包开始扫描,扫描所在包及其子包

@MapperScan:MyBatis框架专用注解,用于指定需要扫描的接口包,将接口注册为MyBatis的映射器bean

java 复制代码
@SpringBootApplication
@ComponentScan({"com.hz.service","com.hz.dao"})
public class SpringbootcsApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootcsApplication.class, args);
    }
}

@SpringBootApplication 注解也包含了 @ComponentScan 注解,所以在使用中也可以通过@SpringBootApplication 注解的 scanBasePackages 属性进行配置

java 复制代码
@SpringBootApplication(scanBasePackages =
{"com.hz.service","com.hz.controller"})

特定功能启用注解

@EnableTransactionManagement :启用Spring的声明式事务管理功能。通常与 @Transactional 注解一起使用,在服务层方法上标注以控制事务行为。

@EnableXXX (例如@EnableScheduling, @EnableCaching等):这类注解用于开启 Spring 框架中某些特定的功能或特性。每个 @Enable 开头的注解都对应着一种Spring提供的额外能力,比如定时任务调度、缓存管理等。

@CrossOrigin:处理跨域请求(较少使用)。

java 复制代码
@SpringBootApplication(scanBasePackages = {"com.hz.service", "com.hz.controller"})
@MapperScan("com.hz.mapper") // 指定要扫描的Mapper接口所在的包
@EnableTransactionManagement // 启用Spring的声明式事务管理
public class SpringbootcsApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootcsApplication.class, args);
    }
}

将 Mybatis 相关单拎出来配置,SpringbootcsApplication 中的 @MapperScan 注解写在 MybatisConfig

java 复制代码
@Configuration
@MapperScan("com.hz.springboot01.mapper")
public class MybatisConfig {}

配置文件加载顺序

读取顺序如下:

  1. config/application.propertiesconfig/application.yml

    (项目根目录中的config目录下)

  2. application.propertiesapplication.yml

    (项目根目录下)

  3. resources/config/application.propertiesresources/config/application.yml

    (项目resources目录中的config目录下)

  4. resources/application.propertiesresources/application.yml

    (项目resources目录下)

全局异常

常用的日志记录工具或框架

  1. Log4j是由 Apache Software Foundation 开发的日志记录框架。是最早也是最流行之一的日志框架。允许开发人员控制哪些日志信息可以被输出,并且可以通过配置文件轻松地更改日志记录级别、格式和目标(如控制台、文件等)。但是由于一些安全漏洞(例如著名的 "Log4Shell" 漏洞),它的第一个主要版本已经不再推荐使用。
  2. Log4j2是 Log4j 的后继者,旨在改进原始 Log4j 的性能和功能。修复了旧版本中的许多问题,包括性能瓶颈,并提供了更强大的配置选项。Log4j2 支持插件式架构,使得添加新的功能更加容易,同时它也提供了对异步日志记录的支持,这可以极大地提高性能。
  3. **SLF4J (Simple Logging Facade for Java)**不是一个具体的日志实现,而是一个抽象层(接口),它为各种日志框架提供了一个统一的门面(Facade)。这意味着可以改变底层的日志实现(比如从 Log4j 切换到 Logback),而不需要修改应用程序代码。SLF4J 提供了简单的 API,使得编写与日志系统无关的应用程序变得非常容易。
  4. Logback是由 Ceki Gülcü 创建的日志框架,他是 Log4j 的原始作者之一。Logback 被设计成 SLF4J 的原生实现。它分为三个模块:logback-core, logback-classic 和 logback-access。logback-classic 模块实现了 SLF4J API 并添加了一些额外的功能;logback-access 模块与 Servlet 容器集成以提供 HTTP 访问日志记录。Logback 比 Log4j 具有更好的性能和更灵活的配置选项。

现在常用 SLF4J + Logback / Log4j2

下面在 SpringBoot 应用程序中实现全局异常处理,包括定义一个自定义异常类。

  • @ControllerAdvice:捕获整个应用中的所有控制器抛出的异常
  • @ExceptionHandler:指定特定类型的异常处理方法
java 复制代码
/**
 * 全局异常统一处理
 */
@ControllerAdvice(basePackages = "com.hz.springboot01")
@Slf4j
public class GlobalException {
    /**
     * 处理自定义异常 SmbmsException
     */
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResultJSON handleException(CustomException e) {
        log.error("异常信息: ", e.getMessage(), e);
        return ResultJSON.error("请求失败" );
    }

    /**
     * 处理运行时异常 RuntimeException
     */
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public ResultJSON handleRuntimeException(RuntimeException e) {
        log.error("异常信息: ", e.getMessage(), e);
        return ResultJSON.error("请求失败");
    }
}

自定义异常

继承运行时异常 RuntimeException,生成一个带参构造方法:

java 复制代码
/**
 * 自定义异常
 */
public class CustomException extends RuntimeException {
    public CustomException(String message) {
        super(message);
    }
}
相关推荐
zwhdlb11 分钟前
Java + 工业物联网 / 智慧楼宇 面试问答模板
java·物联网·面试
Pitayafruit12 分钟前
Spring AI 进阶之路04:集成 SearXNG 实现联网搜索
spring boot·后端·ai编程
风象南15 分钟前
SpringBoot 自研「轻量级 API 防火墙」:单机内嵌,支持在线配置
后端
刘一说27 分钟前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
Victor35632 分钟前
Redis(14)Redis的列表(List)类型有哪些常用命令?
后端
Victor35632 分钟前
Redis(15)Redis的集合(Set)类型有哪些常用命令?
后端
卷福同学33 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
bingbingyihao2 小时前
多数据源 Demo
java·springboot
在努力的前端小白7 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
bobz9659 小时前
小语言模型是真正的未来
后端