Spring 3.0 之前,要使用 Spring 的组件就必须要有一个 XML 配置文件,这也是Spring 的核心配置文件,而 Spring 3.0 之后就可以不要 XML 配置文件了,可以通过新的@Configuration
注解代替 XML 配置文件
文件格式
properties (优先) 》 yml (yaml)
- properties格式:
key=value
# properties
app.memo=这个是.proprtties默认的配置文件-默认环境
app.name=ALeeSpringWeb
app.owner=changming
app.port=8080
- yml格式:
key: value
# yml 注意空格和缩颈
app:
memo: 这个是yml默认的配置文件-默认环境
name: ALeeSpringWeb
owner: changMing001
port: 8081
文件名称: 默认application
application.properties
application.yml
环境对象:Environment
:表示抽象的所有key和value,方法getProperty(key) [在读取方式会介绍具体用法]
多文件
自定义独立的配置文件,使用Spring.config.import = 文件路径。
- 导入多个文件
spring:
config: # 导入其他的配置文件 , 多个文件使用 “,” 作为分隔符
import: config/db.yml,config/redis.yml
多环境
开发环境、测试、上线、特性、bug环境等等
-
application-dev.yml
开发 -
application-test.yml
测试 -
application-feature.yml
特性 -
application-prod.yml
线上 -
application-bug.yml
bug
spring:
profiles: # 激活某个配置环境 application-xxx-.yml
active: dev #默认是 application.yml
读取数据
一、通过 @value
@value("${key}")
@Service
public class HelloService {
@Value("${app.name}")
private String appName;
@Value("${app.owner}")
private String appOwner;
@Value("${app.port:8001}")
private String appPort;
public void printValue() {
StringJoiner stringJoiner = new StringJoiner(",");
stringJoiner.add(appName).add(appOwner).add(appPort);
System.out.println("resurlt: " + stringJoiner);
}
}
二、通过 Environment
Environment.getPropery("key")
@Service
public class ReadConfig {
//注入环境对象
private final Environment environment;
public ReadConfig(Environment environment) {
this.environment = environment;
}
public void print() {
String name = environment.getProperty("app.name");
if (environment.containsProperty("app.owner")) {
System.out.println("owner 存在");
} else {
System.out.println("owner 不存在");
}
//没有数值,提供默认值
int port = environment.getProperty("app.port", Integer.class, 9001);
String str = String.format("读取的数值为 name=%s , port=%d", name, port);
System.out.println(str);
}
}
三、通过 @Bean
用于多个属性(推荐)
@Configuration(proxyBeanMethods = true) //proxyBeanMethods 默认True ApringCGLIB 代理容器 / false单独普通Bean、不放入容器
@ConfigurationProperties(prefix = "app")
public class AppBean {
private String memo;
private String name;
private String owner;
private Integer port;
// get & set ...
@Override
public String toString() {
return "AppBean{" +
"memo='" + memo + '\'' +
", name='" + name + '\'' +
", owner='" + owner + '\'' +
", port='" + port + '\'' +
'}';
}
}
注解 @ Configuration(proxyBeanMethods = true)
- proxyBeanMethods 默认
true
ApringCGLIB 代理容器 -
false
单独普通Bean、不放入容器 ,独立容器不依赖
注解 @ConfigurationProperties
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
boolean ignoreInvalidFields() default false;
boolean ignoreUnknownFields() default true;
}
位置:
- 在类的上面,需要有源代码
- 在方法的上面,使用第三方对象,配合
@Bean
注解
数据的来源
- application文件,
[properties 或者 yml]
- 指定数据的来源
@PropertySource(value = "classpath:/config/pathsource.properties")
,需要注意默认不支持yml的配置,必须要用要写配置配置工厂
注意:
- 类中有无参数的构造方法
- 属性有setXXX方法
- static 属性无效
- 使用Bean的构造方法也能创建对象,
#config/pathsource.properties
group.memo=这个是测试环境配置文件-group
group.name=ALeeSpringWeb-group
group.owner=changMing-group
group.port=8082
//指定数据的来源
@Configuration
@ConfigurationProperties(prefix="group")
@PropertySource(value = "classpath:/config/pathsource.properties")
public class PathAppBean {
private String memo;
private String name;
private String owner;
private Integer port;
//set、get省略...
}
yml配置工厂 YamlPropertySourceFactory.class
@Configuration
@ConfigurationProperties(prefix = "group-yml")
@PropertySource(value = "classpath:/config/pathsource.yml", factory = YamlPropertySourceFactory.class)
public class PathYmlAppBean {
private String memo;
private String name;
private String owner;
private Integer port;
//set、get省略...
}
配置工厂、重写 DefaultPropertySourceFactory
package com.example.alee.ALeeSpringWeb.factory;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public org.springframework.core.env.PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
Resource resourceResource = resource.getResource();
System.out.println("resource Resource info");
if (!resourceResource.exists()) {
System.out.println("resource not exist");
return new PropertiesPropertySource(null, new Properties());
} else if (
resourceResource.getFilename().endsWith(".yml") ||
resourceResource.getFilename().endsWith(".yaml")) {
System.out.println("resourceResource = {}" + resourceResource.getFilename());
List<PropertySource<?>> sources = new YamlPropertySourceLoader()
.load(resourceResource.getFilename(), resourceResource);
return sources.get(0);
}
return super.createPropertySource(name, resource);
}
}
自动配置
自动配置文件的命名可以有以下参考配置类:
-
MybatisConfiguration
: Mybatis配置 -
MainConfiguration
: 项目主要配置 -
DataSoureceConfiguration
: 数据源配置 -
RedisConfiguration
: Redis 配置 -
MongoDBConfiguration
: MongoDB 配置 - ...
End。
网友评论