实现CommandLineRunner接口,实现程序启动执行特定逻辑
//启动类实现CommandLineRunner接口,重写run方法
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private HomeProperties homeProperties;
public static void main(String[] args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
//todo 程序启动就执行的逻辑
System.out.println("\n" + homeProperties.toString());
System.out.println();
}
}
在 Spring Boot 的启动类上实现 CommandLineRunner
接口可以实现在 Spring Boot 应用程序启动后立即执行特定的代码。这个接口只包含一个方法 run(String... args)
,在应用程序启动后,Spring Boot 将会调用这个方法,并传递启动时的命令行参数。
实现 CommandLineRunner
接口的主要用途包括:
-
应用程序初始化: 可以在应用程序启动后执行一些初始化逻辑,例如加载初始数据、创建必要的资源等。
-
启动时任务: 可以在应用程序启动时执行一些必要的任务,例如检查环境配置、启动后台服务等。
-
定时任务: 可以在应用程序启动后立即启动定时任务,执行需要在应用程序启动后立即开始的周期性任务。
-
预热缓存: 可以在应用程序启动后立即开始预热缓存,以提高应用程序性能。
-
执行一次性任务: 可以执行一些需要在应用程序启动后立即完成的一次性任务,例如数据迁移、数据库更新等。
通过实现 CommandLineRunner
接口,可以方便地将特定的逻辑与应用程序启动过程集成在一起,使得应用程序启动后可以立即执行所需的操作,提高了应用程序的灵活性和可控性。
@ConfigurationProperties注解将配置文件中的属性值映射到 Java 对象上
原理:
- Spring Boot 在启动时会自动扫描被
@ConfigurationProperties
注解标记的类。 - 对于这些被标记的类,Spring Boot 会根据配置文件中的属性名和类中的属性名进行匹配,并将属性值自动绑定到对应的类属性上。
- Spring Boot 使用了 Spring 的数据绑定机制,通过
Binder
进行属性值的绑定。 - 如果配置文件中没有配置某个属性,而对应的 Java 类中有默认值,那么将使用默认值进行绑定。
- 可以通过
@EnableConfigurationProperties
注解或者在@Configuration
类中声明一个@Bean
方法返回@ConfigurationProperties
注解标记的类的实例来启用@ConfigurationProperties
作用:
- 简化配置文件: 可以将配置文件中的相关属性值统一放置在一个 Java 类中,提高配置文件的可读性和维护性。
- 类型安全: 通过将配置属性映射到 Java 对象上,可以提供类型安全的配置,减少因属性类型不匹配而引发的错误。
- IDE支持: 配置属性在 Java 类中定义,IDE 可以提供代码提示和自动补全功能,提高开发效率。
- 属性验证: 可以通过在 Java 类中定义属性的注解来对属性值进行验证,保证配置的合法性。
- 便于管理和扩展: 将配置属性封装在一个类中,便于统一管理和维护,也方便后续对配置进行扩展和修改。
示例:
1.编写配置文件
2.绑定到实体对象上
@Component
@ConfigurationProperties(prefix = "home")
public class HomeProperties {
/**
* 省份
*/
private String province;
/**
* 城市
*/
private String city;
/**
* 描述
*/
private String desc;
在父pom(聚合工程)统一定义管理jar包版本
<properties>
//在聚合项目的pom文件中,使用<properties>去统一定义子项目依赖jar包版本
<mybatis-spring-boot>1.2.0</mybatis-spring-boot>
<mysql-connector>5.1.39</mysql-connector>
<fastjson-version>1.2.32</fastjson-version>
</properties>
Redis常用的配置属性信息
## Redis 配置
## Redis数据库索引(默认为0)
spring.redis.database=0
## Redis服务器地址
spring.redis.host=127.0.0.1
## Redis服务器连接端口
spring.redis.port=6379
## Redis服务器连接密码(默认为空)
spring.redis.password=
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
## 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
## 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
## 连接超时时间(毫秒)
spring.redis.timeout=0
Druid常用配置属性信息
# Druid连接池的初始化大小
spring.datasource.druid.initialSize=5
# Druid连接池的最小空闲连接数
spring.datasource.druid.minIdle=5
# Druid连接池的最大活跃连接数
spring.datasource.druid.maxActive=20
# Druid连接池获取连接的最大等待时间,-1表示无限等待
spring.datasource.druid.maxWait=-1
# Druid连接池中连接的检测时间间隔
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# Druid连接池中连接的最小生存时间
spring.datasource.druid.minEvictableIdleTimeMillis=300000
# Druid连接池是否在空闲时检查连接的有效性
spring.datasource.druid.testWhileIdle=true
# Druid连接池在获取连接时是否检查连接的有效性
spring.datasource.druid.testOnBorrow=false
# Druid连接池在归还连接时是否检查连接的有效性
spring.datasource.druid.testOnReturn=false
# Druid连接池是否缓存预编译的SQL语句
spring.datasource.druid.poolPreparedStatements=true
# Druid连接池缓存预编译的SQL语句的最大数量
spring.datasource.druid.maxOpenPreparedStatements=20
```
使用HashMap模拟数据库CRUD操作
@Service
public class CityServiceImpl implements CityService {
// 定义Map模拟数据库存储
private Map<String, City> cityMap = new HashMap<String, City>();
public void saveCity(City city){
// 模拟数据库插入操作
cityMap.put(city.getCityName(), city);
}
@Cacheable(value = "baseCityInfo")
public City getCityByName(String cityName){
// 模拟数据库查询并返回
return cityMap.get(cityName);
}
@CachePut(value = "baseCityInfo")
public void updateCityDescription(String cityName, String description){
City city = cityMap.get(cityName);
city.setDescription(description);
// 模拟更新数据库
cityMap.put(cityName, city);
}
}
使用@Profile限定bean的加载初始化
介绍:
当 @Profile 注解应用于一个类或方法时,它指定了这个类或方法仅在对应的激活环境(profile)下才会被 Spring 容器加载和初始化。环境通常与外部条件有关,比如开发环境、测试环境、生产环境等。
使用案例:
1. 基于 @Profile 激活不同的配置类
@Configuration
@Profile("dev")
public class DevConfig {
// 仅在 "dev" 环境下生效的配置类
}
@Configuration
@Profile("prod")
public class ProdConfig {
// 仅在 "prod" 环境下生效的配置类
}
2. 基于 @Profile 激活不同的 bean
@Bean
@Profile("dev")
public MyDevBean myDevBean() {
return new MyDevBean();
}
@Bean
@Profile("prod")
public MyProdBean myProdBean() {
return new MyProdBean();
}
3.题外话:在 Spring 应用程序中,可以通过以下方式激活特定的 profile:
方式1:
在启动参数中指定: 当你通过命令行启动 Spring Boot 应用程序时,可以通过 --spring.profiles.active 参数来指定要激活的 profile。
java -jar myapp.jar --spring.profiles.active=dev
方式2:
在 application.properties 或 application.yml 文件中指定: 你可以在配置文件中指定 active profile。
# application.properties
spring.profiles.active=dev
# application.yml
spring:
profiles:
active: dev