hooyantsing's Blog

白银篇_P5_加载额外配置文件的两种方式

字数统计: 760阅读时长: 3 min
2020/07/17

加载额外配置文件的两种方式

20年全新-Spring Boot 2.x从青铜到王者之白银篇-打造精品中的精品-程序员-编程-架构师-SpringBoot

融合老项目。

加载额外配置文件的两种方式:

  • @PropertySource 加载自定义 yml 或者 properties 文件。
  • @ImprotResource 加载Spring的 xml 配置文件。

    @PropertySource

value properties 或 yml 配置文件路径

factory 默认不用填写,如果配置文件是yml文件,写入改造的类.class。

加载额外的配置文件,即application全局配置文件以外的配置文件

注意:默认是加载 properties 文件的,对 yml 不支持。因此我们需要对其改造。

创建一个 MixPropertySourceFactory 类,继承于 DefaultPropertySourceFactory 重写其 createPropertySource 方法。

MixPropertySourceFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package xyz.hooy.demo.service;

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.lang.Nullable;

import java.io.IOException;
import java.util.Properties;

public class MixPropertySourceFactory extends DefaultPropertySourceFactory {

public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
//return name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource);

// 如果是 .yml 或 .yaml 文件
String sourceName = name != null ? name : resource.getResource().getFilename();
if(sourceName != null && (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml"))){
// yml -> properties
Properties propertiesFromYml = loadYml(resource);
return new PropertiesPropertySource(sourceName,propertiesFromYml);
} else {
// 如果是 properties
return super.createPropertySource(name,resource);
}
}

private Properties loadYml (EncodedResource resource) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
}

}

Family.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package xyz.hooy.demo.silver.p3;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import xyz.hooy.demo.service.MixPropertySourceFactory;

@Data
@Component
@ConfigurationProperties(prefix = "family")
@Validated
@PropertySource(value = "classpath:family.yml",factory = MixPropertySourceFactory.class)
public class Family {
private String familyName;
private Father father;
private Mother mother;
private Child child;
}

@ImprotResource

locations xml 配置文件路径

启动类 加载spring的xml配置文件,与老项目对接

先假设有个老项目,他的配置文件是 bean.xml

bean.xml

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean ></bean>

</beans>

对应的类是 TestBeanService 。(为了简化,这里代码逻辑为空)

TestBeanService.java

1
2
3
4
5
package xyz.hooy.demo.service;

public class TestBeanService {
}

要将 @ImprotResource 注解加入到 启动类 里。

Application.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package xyz.hooy.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource(locations = {"classpath:bean.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

最后,测试一下 bean.xml 里的 bean 是否已经注入到 IOC 容器。

ImprotResourceTests.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package xyz.hooy.demo.silver;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import xyz.hooy.demo.silver.p3.Family;

import javax.annotation.Resource;

@SpringBootTest
@ExtendWith(SpringExtension.class)
public class ImprotResourceTests {

@Resource
private ConfigurableApplicationContext ioc;

@Test
public void testImport(){
boolean isImport = ioc.containsBean("testBeanService");
System.out.println(isImport);
}
}

最后返回的结果为 true ,说明 bean.xml 里的 bean 已经正常注入到 IOC 容器内。

CATALOG
  1. 1. 加载额外配置文件的两种方式
    1. 1.0.1. @PropertySource
    2. 1.0.2. @ImprotResource