文章目录
常用注解
配置类注解
@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环境中,使得可以通过@Value
或Environment
对象访问这些属性。
@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 {}
配置文件加载顺序
读取顺序如下:
-
config/application.properties
、config/application.yml
(项目根目录中的
config
目录下) -
application.properties
、application.yml
(项目根目录下)
-
resources/config/application.properties
、resources/config/application.yml
(项目
resources
目录中的config
目录下) -
resources/application.properties
、resources/application.yml
(项目
resources
目录下)
全局异常
常用的日志记录工具或框架
- Log4j是由 Apache Software Foundation 开发的日志记录框架。是最早也是最流行之一的日志框架。允许开发人员控制哪些日志信息可以被输出,并且可以通过配置文件轻松地更改日志记录级别、格式和目标(如控制台、文件等)。但是由于一些安全漏洞(例如著名的 "Log4Shell" 漏洞),它的第一个主要版本已经不再推荐使用。
- Log4j2是 Log4j 的后继者,旨在改进原始 Log4j 的性能和功能。修复了旧版本中的许多问题,包括性能瓶颈,并提供了更强大的配置选项。Log4j2 支持插件式架构,使得添加新的功能更加容易,同时它也提供了对异步日志记录的支持,这可以极大地提高性能。
- **SLF4J (Simple Logging Facade for Java)**不是一个具体的日志实现,而是一个抽象层(接口),它为各种日志框架提供了一个统一的门面(Facade)。这意味着可以改变底层的日志实现(比如从 Log4j 切换到 Logback),而不需要修改应用程序代码。SLF4J 提供了简单的 API,使得编写与日志系统无关的应用程序变得非常容易。
- 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);
}
}