Spring Boot @PropertySource 載入指定配置檔案、@ImportResource 匯入Spring 配置檔案

蚩尤後裔發表於2018-07-11

目錄

@PropertySource 載入 properties 配置檔案

@PropertySource 載入 yml 配置檔案

@ImportResource 匯入Spring 配置檔案


@PropertySource 載入 properties 配置檔案

1、通過《Spring Boot  @ConfigurationProperties 、@Value 注值》知道使用“@Value”與“@ConfigurationProperties”可以從全域性配置檔案“application.properties”或者“application.yml”中取值,然後為需要的屬性賦值。

2、當應用比較大的時候,如果所有的內容都當在一個配置檔案中,就會顯得比較臃腫,同時也不太好理解和維護,此時可以將一個檔案拆分為多個,使用 @PropertySource 註解載入指定的配置檔案

3、下面演示使用 @PropertySource 註解 載入類路徑下的 user.properties 配置檔案,為 User.java POJO 物件的屬性賦值。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * @author wangmaoxiong
 * Created by Administrator on 2018/7/11 0011.
 * 使用者···實體
 * @ConfigurationProperties 表示 告訴 SpringBoot 將本類中的所有屬性和配置檔案中相關的配置進行繫結;
 * prefix = "user" 表示 將配置檔案中 key 為 user 的下面所有的屬性與本類屬性進行一一對映注入值,如果配置檔案中
 * 不存在 "user" 的 key,則不會為 POJO 注入值,屬性值仍然為預設值
 * <p/>
 * @Component 將本來標識為一個 Spring 元件,因為只有是容器中的元件,容器才會為 @ConfigurationProperties 提供此注入功能
 * @PropertySource (value = { " classpath : user.properties " }) 指明載入類路徑下的哪個配置檔案來注入值
 */
@PropertySource(value = {"classpath:user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    private Integer id;
    private String lastName;
    private Integer age;
    private Date birthday;
    private List<String> colorList;
    private Map<String, String> cityMap;
    private Dog dog;

    //省略 getter、setter 、toString 方法沒貼上
}
/**
 * @author wangmaoxiong
 * Created by Administrator on 2018/7/11 0011.
 * 狗 實體類-----------普通 Java Bean。 
 * 被依賴項可以不加 @ConfigurationProperties 註解,但是必須提供 getter、setter 方法
 */
public class Dog {
    private Integer id;
    private String name;
    private Integer age;
    //省略 getter、setter 、toString 方法
}

4、在類路徑下提供 user.properties 配置檔案如下(.yml 檔案也是同理):

user.id=111
user.lastName=張無忌
user.age=120
user.birthday=2018/07/11
user.colorList=red,yellow,green,blacnk
user.cityMap.mapK1=長沙市
user.cityMap.mapK2=深圳市
user.dog.id=7523
user.dog.name=狗不理
user.dog.age=3

5、測試執行:

import com.wmx.yuanyuan.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
public class YuanyuanApplicationTests {
    /**
     * 因為 POJO類 使用了 Component 註解,就是 Spring 一個元件,交由了 Spring 容器注入值
     * 所以使用 @Autowired 或者 @Resource,DI 注入在取值即可
     */
    @Resource
    private User user;
    @Test
    public void contextLoads() {
        System.out.println("------------------------------********************--------------------------------------------");
        System.out.println("·······················" + user);
    }
}

@PropertySource 載入 yml 配置檔案

1、在上面 properties 的基礎上修改如下:

@PropertySource(value = {"classpath:user.yml"}, factory = PropertySourceFactory.class)

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);
    }
}

@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] 表示載入成功。

 

相關文章