Java开发实用技巧和代码片段

实现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 接口的主要用途包括:

  1. 应用程序初始化: 可以在应用程序启动后执行一些初始化逻辑,例如加载初始数据、创建必要的资源等。

  2. 启动时任务: 可以在应用程序启动时执行一些必要的任务,例如检查环境配置、启动后台服务等。

  3. 定时任务: 可以在应用程序启动后立即启动定时任务,执行需要在应用程序启动后立即开始的周期性任务。

  4. 预热缓存: 可以在应用程序启动后立即开始预热缓存,以提高应用程序性能。

  5. 执行一次性任务: 可以执行一些需要在应用程序启动后立即完成的一次性任务,例如数据迁移、数据库更新等。

通过实现 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

  • 47
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值