SpringBoot + properties 简单使用
如果你觉得本文对你有帮助,欢迎赞赏[1]
SpringBoot + properties 简单使用
往前回顾:
上一节简单的介绍了SpringBoot + Dubbo + Mybatis
实现分布式服务确定了在服务提供主要包括两部分,
一个是暴露服务,
一个是服务实现,
暴露服务:即我们平常开发中所使用的的接口。
服务实现:与我们平常的服务一样,对接口进行实现,
比较特别的是,我们这里需要使用到Dubbo 的 @Service
注解在配置方面,为了防止端口冲突,我们各自定义了
服务端口注解:server.port=6660和server.port=6661
通过spring.dubbo.scan扫描使用的dubbo接口所在包位置
再有就是引用了些许SpringBoot官方的包。
另外,在Mybatis如果Mapper.xml与Mapper.class不在
同一个包下或者不同名,就必须使用配置mapperLocations
指定mapper.xml的位置,通过namespace的值来确定对应的
Mapper.class的。
记得在启动类加 mapper 接口类扫描包配置
@MapperScan
("com.herbert.hdd.doorplate.dubbo.dao")
详见:
《SpringBoot 整合Dubbo构建分布式服务》
《SpringBoot + Dubbo + Mybatis 分层实现分布式服务》
项目构建
配置文件
在src/main/resource目录下建立:
application.properties文件
spring.profiles.active=dev
server.port=6663
application-dev.properties文件
home.name=摘星族
home.city=BeiJing
home.desc=I love ${home.name} city in ${home.city}.
application-prod.properties文件
home.name=Herbert
home.city=ShangHai
home.desc=I love ${home.name} city in ${home.city}.
springboot的配置文件命名约定,结合active可在不同环境引用不同的properties外部配置
application.properties配置文件欲被SpringBoot自动加载,需要放置到指定的位置:src/main/resource目录下,一般自定义的配置文件也位于此目录之下。
applicaiton.properties属性绑定JavaBean
我们需要与属性绑定的JavaBean的类,在定义顶部加
@Component注解
和@ConfigurationProperties(prefix="key")注解,
前者的目的是为了这个JavaBean可以被SpringBoot项目启动时候被扫描到并加载到Spring容器之中,后者@ConfigurationProperties(prefix="key")注解加注在JavaBean类定义之上,为属性配置注解,更直接点的说法就是属性绑定注解。如果想要绑定或者验证一些来源自.properties文件中的额外属性时,你可以在一个标注的@Configuration的类的注有@Bean注解的方法或者一个类之上加注这个注解。我们完全可以将其理解为绑定专用注解。它的作用就是将指定的前缀的配置项的值与JavaBean的字段绑定,这里要注意,为了绑定的成功,一般将字段的名称与配置项键的最后一个键名相同,这样整个键在去掉前缀的情况下就和字段名称一致,以此来进行绑定。
所以,我们需要去建立一个实体类,通过@ConfigurationProperties(prefix="key")注解绑定JavaBean
HomeProperties 实体
package com.herbert.springboot.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 公众号详情
*/
@Component
@ConfigurationProperties(prefix = "home")
public class HomeProperties {
/**
* 公众号名称
*/
private String name;
/**
* 公众号所在城市
*/
private String city;
/**
* 描述
*/
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "HomeProperties{" +
"name='" + name + '\'' +
", city='" + city + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
PropertiesApplication 启动类
package com.herbert.springboot;
import com.herbert.springboot.properties.HomeProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类
*/
@SpringBootApplication
public class PropertiesApplication implements CommandLineRunner {
@Autowired
private HomeProperties homeProperties;
public static void main(String[] args) {
SpringApplication.run(PropertiesApplication.class, args);
}
@Override
public void run(String... strings) throws Exception {
System.out.println(homeProperties.toString());
}
}
在使用SpringBoot构建项目时,我们通常有一些预先数据的加载。那么SpringBoot提供了一个简单的方式来实现–CommandLineRunner。CommandLineRunner是一个接口,我们需要时,只需实现该接口就行。如果存在多个加载的数据,我们也可以使用@Order注解来排序。
我们在开发过程中会有这样的场景:需要在容器启动的时候执行一些内容,比如:读取配置文件信息,数据库连接,删除临时文件,清除缓存信息,在Spring框架下是通过ApplicationListener监听器来实现的。在Spring Boot中给我们提供了两个接口来帮助我们实现这样的需求。这两个接口就是CommandLineRunner和ApplicationRunner,他们的执行时机为容器启动完成的时候。
测试
在spring.profiles.active=dev的时候启动项目后运行
HomeProperties{name='摘星族', city='BeiJing', desc='I love 摘星族 city in BeiJing.'}
在spring.profiles.active=prod 的时候启动项目后运行
HomeProperties{name='Herbert', city='ShangHai', desc='I love Herbert city in ShangHai.'}
欢迎关注公众号: