Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件

Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件目录需求背景项目结构@PropertySource加载指定配置文件资源配置文件测试运行需求背景1、通过《SpringBoot全局配置文件》与《@Value取赋值详解与@ConfigurationProperties对比》已经知道使用“@Value”注解与“@ConfigurationProperties”可以从全局配置文件“application.prope...

目录

@PropertySource 加载 properties 配置文件

@PropertySource 加载 yml 配置文件

@PropertySource 从本地磁盘加载文件

@ImportResource 导入Spring 配置文件


@PropertySource 加载 properties 配置文件

1、通过《Spring Boot  @ConfigurationProperties 、@Value 注值》知道使用“@Value”与“@ConfigurationProperties”可以从全局配置文件“application.properties”或者“application.yml”中取值,然后为需要的属性赋值。

2、当应用比较大的时候,如果所有的内容都当在一个配置文件中,就会显得比较臃肿,同时也不太好理解和维护,此时可以将一个文件拆分为多个,使用 @PropertySource 注解加载指定的配置文件,注解常用属性如下:

String name() default "" 指明此属性源的名称。如果省略,将根据基础资源的描述生成名称。
String[] value()

指示要加载的属性文件的资源位置。

1、支持传统和基于XML的属性文件格式,如 {"classpath:/com/myco/app.properties"} 或 {"file:/path/to/file.xml"}

2、支持加载类路径下的文件以及本地磁盘上的文件。

boolean ignoreResourceNotFound() default false 指示 value 资源位置查找失败时是否忽略,默认 false,找不到就会报错。
String encoding() default "" 给定资源的特定字符编码,例如“UTF-8”
Class<? extends PropertySourceFactory> factory()

指定自定义属性SourceFactory(如果有)。

默认情况下,将使用标准资源文件的默认工厂。

3、下面演示使用 @PropertySource 注解 加载类路径下的 user.properties 配置文件,为 User.java POJO 对象的属性赋值。

/**
 * 用户···实体
 * {@code @Component} 将本来标识为一个 Spring 组件,因为只有是容器中的组件,容器才会为 @ConfigurationProperties 提供此注入功能
 * {@code @PropertySource} 指明加载类路径下的哪个配置文件来注入值
 * {@code @ConfigurationProperties} 表示 告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;
 * * prefix = "user1" 表示 将配置文件中 key 为 user 的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中-
 * * 不存在 "user1" 的 key,则不会为 POJO 注入值,属性值仍然为默认值
 *
 * @author wangmaoxiong
 * Created by Administrator on 2018/7/11 0011.
 */
@Component
@PropertySource(value = {"classpath:user.properties"})
@ConfigurationProperties(prefix = "user1")
public class UserProperty {
    private Integer id;
    private String lastName;
    private Integer age;
    private Date birthday;
    private List<String> colorList;
    private Map<String, String> cityMap;
    private Dog dog;
只听到从架构师办公室传来架构君的声音:
过门走马何官职,侧帽笼鞭战北风!屋上添高一把茅,密泥房壁似僧寮。有谁来对上联或下联?

src/main/java/com/wmx/yuanyuan/pojo/UserProperty.java · 汪少棠/yuanyuan - Gitee.com

此代码由Java架构师必看网-架构君整理
/** * 狗 实体类-----------普通 Java Bean * 被依赖项可以不加 @ConfigurationProperties 注解,但是必须提供 getter、setter 方法 * * @author wangmaoxiong * Created by Administrator on 2018/7/11 0011. */ public class Dog { private Integer id; private String name; private Integer age;

src/main/java/com/wmx/yuanyuan/pojo/Dog.java · 汪少棠/yuanyuan - Gitee.com

4、在类路径下提供 user.properties 配置文件如下(.yml 文件也是同理):

user1.id=112
user1.lastName=\u5F20\u65E0\u5FCC
user1.age=110
user1.birthday=2018/07/12
user1.colorList=red,yellow,green,blacnk
user1.cityMap.mapK1=\u957F\u6C99\u5E02
user1.cityMap.mapK2=\u6DF1\u5733\u5E02
user1.dog.id=7523
user1.dog.name=\u72D7\u4E0D\u7406
user1.dog.age=3

src/main/resources/user.properties · 汪少棠/yuanyuan - Gitee.com

5、测试运行:src/test/java/com/wmx/yuanyuan/PropertySourceTest.java · 汪少棠/yuanyuan - Gitee.com

Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件

@PropertySource 加载 yml 配置文件

1、仍然以为实体对象注入属性值为例进行演示:

此代码由Java架构师必看网-架构君整理
/** * 用户···实体 * {@code @Component} 将本来标识为一个 Spring 组件,因为只有是容器中的组件,容器才会为 @ConfigurationProperties 提供此注入功能 * {@code @PropertySource} 指明加载类路径下的哪个配置文件来注入值 * * factory:用于指定 @PropertySource 加载 yml 配置文件. * {@code @ConfigurationProperties} 表示 告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定; * * prefix = "user" 表示 将配置文件中 key 为 user 的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中- * * 不存在 "user" 的 key,则不会为 POJO 注入值,属性值仍然为默认值 * * @author wangmaoxiong * Created by Administrator on 2018/7/11 0011. */ @Component @PropertySource(value = {"classpath:user.yml"}, factory = PropertySourceFactory.class) @ConfigurationProperties(prefix = "user") public class UserYml { private Integer id; private String lastName; private Integer age; private Date birthday; private List<String> colorList; private Map<String, String> cityMap; private Dog dog; //...... }

 src/main/java/com/wmx/yuanyuan/pojo/UserYml.java · 汪少棠/yuanyuan - Gitee.com

2、然后提供用于处理 yml 配置文件的属性资源工程如下:

import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.List;
/**
 * 用于  @PropertySource 加载 yml 配置文件.
 *
 * @author wangmaoxiong
 * @version 1.0
 * @date 2020/5/25 20:45
 */
public class PropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        if (resource == null) {
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        return sources.get(0);
    }
}

src/main/java/com/wmx/yuanyuan/factory/PropertySourceFactory.java · 汪少棠/yuanyuan - Gitee.com

测试运行:src/test/java/com/wmx/yuanyuan/PropertySourceTest.java · 汪少棠/yuanyuan - Gitee.com

Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件

@PropertySource 从本地磁盘加载文件

1、PropertySource 不仅支持加载类路径下的文件,还支持加载本地磁盘上的文件。

/**
 * 用户···实体————读取本地磁盘上的配置文件
 * * @Component  将本来标识为一个 Spring 组件,因为只有是容器中的组件,容器才会为 @ConfigurationProperties 提供此注入功能
 * * @PropertySource 指明加载类路径下的哪个配置文件来注入值,既可以是类路径下,也可以上磁盘上
 * * @ConfigurationProperties 表示 告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;
 * * * prefix = "user1" 表示 将配置文件中 key 为 user 的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中-
 * * * 不存在 "user1" 的 key,则不会为 POJO 注入值,属性值仍然为默认值
 * <p>
 * 磁盘路径可以是相对路径,绝对路径,也可以通过系统属性值指定变量
 * * 相对路径,文件在应用根目录下:@PropertySource(value = {"file:userDisk.properties"})
 * * 相对路径,文件在应用根目录下:@PropertySource(value = {"file:./userDisk.properties"})
 * * 绝对路径,在指定的路径下:@PropertySource(value = {"file:D:\\project\\IDEA_project\\yuanyuan\\userDisk.properties"})
 * * 通过系统属性值指定变量:@PropertySource(value = {"file:${user.dir}/userDisk.properties"})
 * * * user.dir:用户的当前工作目录
 *
 * @author wangmaoxiong
 * Created by Administrator on 2018/7/11 0011.
 */
@Component
@PropertySource(value = {"file:${user.dir}/userDisk.properties"})
@ConfigurationProperties(prefix = "user2")
public class UserDisk {
    private Integer id;
    private String lastName;
    private Integer age;
    private Date birthday;
    private List<String> colorList;
    private Map<String, String> cityMap;
    private Dog dog;

src/main/java/com/wmx/yuanyuan/pojo/UserDisk.java · 汪少棠/yuanyuan - Gitee.com 

 磁盘文件(其它 yml、xml格式也是同理):userDisk.properties · 汪少棠/yuanyuan - Gitee.com

测试类:src/test/java/com/wmx/yuanyuan/PropertySourceTest.java · 汪少棠/yuanyuan - Gitee.com

Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件

@ImportResource 导入Spring 配置文件

1、@ImportResource 注解用来导入 Spring 的配置文件,如核心配置文件 "beans.xml",从而让配置文件里面的内容生效;

2、如果应用中仍然想采用以前 xml 文件的配置方式,如 "beans.xml" ,则使用 “@ImportResource” 注解轻松搞定。

3、将 @ImportResource 标注在一个配置类上,通常直接放置在应用启动类上,和 @SpringBootApplication 一起即可。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
/**
 * 应用启动类
 *
 * @ImportResource 必须放置在配置类上,通常放在启动类即可,用 value 指明导入类路径下的那个 Spring 配置文件
 */
@ImportResource(value = {"classpath:beans.xml"})
@SpringBootApplication
public class CocoApplication {
    public static void main(String[] args) {
        SpringApplication.run(CocoApplication.class, args);
    }
}

4、然后就可以在类路径下提供原始的 beans.xml 配置文件:

<?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">

    <!-- 放入到Sping容器中,这是以前Spring的内容,不再累述-->
    <bean id="userService" class="com.lct.service.UserService"/>
</beans>

5、启动应用控制台会打印:loading XML bean definitions from class path resource [beans. xml] 表示加载成功。

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/209421
0

发表评论