【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);
    }
}
相关推荐
StayInLove5 分钟前
线程池中线程异常后到底是怎么处理的
java·jvm·算法
忆枫呐♬7 分钟前
idea无法识别文件,如何把floder文件恢复成model
java·gitee·intellij-idea
好奇的菜鸟10 分钟前
如何为IntelliJ IDEA配置JVM参数
开发语言·后端
陌上花开࿈18 分钟前
用户登录认证
java·开发语言·前端
Simon_Smith20 分钟前
SpringBoot+IDEA工具框架快捷键+注解备注
spring boot·后端·intellij-idea
揽月随风醉26 分钟前
golang 判断一个点是否在一个多边形内
开发语言·后端·golang
小小李程序员38 分钟前
java乱序执行实验
java·开发语言·python
怒放de生命20101 小时前
jenkins 出现 Jenkins: 403 No valid crumb was included in the request
java·servlet·jenkins
shaoweijava1 小时前
企业车辆管理系统(源码+数据库+报告)
java·数据库·spring boot·mysql
Java&Develop2 小时前
ShardingSphere-多表关联
java·数据库