springboot自定義屬性文件與bean映射注入屬性值


主要有幾點:

一、導入依賴

springboot的包和:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>

版本在父類里統一管理了

<optional>true</optional>
</dependency>

一、配置自定義屬性文件

1 rabbit.config.host=192.168.135.129
2 rabbit.config.port=5672
3 rabbit.config.userName=guest
4 rabbit.config.password=guest

二、在屬性bean上的注解后期版本1.4以后主要是如下三個,且不需要在啟動類上添加額外注解

@Component
@ConfigurationProperties(prefix="rabbit.config")
@PropertySource(value="classpath:config/rabbitmq.properties",encoding="utf-8")

也不需要在項目啟動類上增加@EnableConfigurationProperties這個注解。

當然在打包的時候也要將該屬性文件包含進來記得在pom文件的

<resources>
<resource>下面添加包含進自定義的文件,否則找不到文件報錯。

項目啟動類代碼:

 1 package com.sharp.forward;
 2 
 3 import org.mybatis.spring.annotation.MapperScan;
 4 import org.slf4j.Logger;
 5 import org.slf4j.LoggerFactory;
 6 import org.springframework.boot.CommandLineRunner;
 7 import org.springframework.boot.SpringApplication;
 8 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 9 import org.springframework.boot.autoconfigure.SpringBootApplication;
10 
11 import com.sharp.forward.config.RabbitMQProperties;
12 
13 @SpringBootApplication
14 //@ImportResource("classpath:config/application-user-service-dubbo.xml")
15 @MapperScan(basePackages= {"com.sharp.forward.mapper"})
16 @EnableAutoConfiguration
17 public class Application implements CommandLineRunner{
18     
19     private static final Logger log = LoggerFactory.getLogger(Application.class);
20     public static void main(String[] args) {
21         SpringApplication.run(Application.class, args);
22     }
23 
24     /**
25      * @param args
26      * @throws Exception
27      */
28     @Override
29     public void run(String... args) throws Exception {
30          String config = "host: " + RabbitMQProperties.getHost()
31          + ", config.port:" + RabbitMQProperties.getPort() 
32          + ", config.userName:" + RabbitMQProperties.getUserName();
33 
34 log.info("SpringBoot2.0實現自定義properties配置文件與JavaBean映射:" + config);
35         
36     }
37     
38 }

啟動項目后打印如下:

INFO com.sharp.forward.Application - SpringBoot2.0實現自定義properties配置文件與JavaBean映射:host: null, config.port:0, config.userName:null

說明沒有注入進來,然后在看我的屬性bean類

 1 /**
 2  * 
 3  */
 4 package com.sharp.forward.config;
 5 
 6 import org.springframework.boot.context.properties.ConfigurationProperties;
 7 import org.springframework.context.annotation.Configuration;
 8 import org.springframework.context.annotation.PropertySource;
 9 import org.springframework.stereotype.Component;
10 
11 /**
12  * @author 醉逍遙
13  *
14  */
15 @Component
16 @ConfigurationProperties(prefix="rabbit.config")
17 @PropertySource(value="classpath:config/rabbitmq.properties",encoding="utf-8")
18 public class RabbitMQProperties {
19     
20     private static String host;
21     
22     private static int port;
23     
24     private static String userName;
25     
26     private static String password;
27     
28     public static String getHost() {
29         return host;
30     }
31     public static void setHost(String host) {
32         RabbitMQProperties.host = host;
33     }
34     public static int getPort() {
35         return port;
36     }
37     public static void setPort(int port) {
38         RabbitMQProperties.port = port;
39     }
40     public static String getUserName() {
41         return userName;
42     }
43     public static void setUserName(String userName) {
44         RabbitMQProperties.userName = userName;
45     }
46     public static String getPassword() {
47         return password;
48     }
49     public static void setPassword(String password) {
50         RabbitMQProperties.password = password;
51     }
52     
53 }

各屬性和方法都是靜態的,問題就出在這里,於是將靜態的均修改掉如下

屬性bean

 1 /**
 2  * 
 3  */
 4 package com.sharp.forward.config;
 5 
 6 import org.springframework.boot.context.properties.ConfigurationProperties;
 7 import org.springframework.context.annotation.PropertySource;
 8 import org.springframework.stereotype.Component;
 9 
10 /**
11  * @author 醉逍遙
12  *
13  */
14 @Component
15 @ConfigurationProperties(prefix="rabbit.config")
16 @PropertySource(value="classpath:config/rabbitmq.properties",encoding="utf-8")
17 public class RabbitMQProperties {
18     
19     public String getHost() {
20         return host;
21     }
22 
23     public void setHost(String host) {
24         this.host = host;
25     }
26 
27     public int getPort() {
28         return port;
29     }
30 
31     public void setPort(int port) {
32         this.port = port;
33     }
34 
35     public String getUserName() {
36         return userName;
37     }
38 
39     public void setUserName(String userName) {
40         this.userName = userName;
41     }
42 
43     public String getPassword() {
44         return password;
45     }
46 
47     public void setPassword(String password) {
48         this.password = password;
49     }
50 
51     private  String host;
52     
53     private int port;
54     
55     private  String userName;
56     
57     private  String password;
58     
59 
60     
61 }

啟動類

 1 package com.sharp.forward;
 2 
 3 import org.mybatis.spring.annotation.MapperScan;
 4 import org.slf4j.Logger;
 5 import org.slf4j.LoggerFactory;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.CommandLineRunner;
 8 import org.springframework.boot.SpringApplication;
 9 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
10 import org.springframework.boot.autoconfigure.SpringBootApplication;
11 
12 import com.sharp.forward.config.RabbitMQProperties;
13 
14 @SpringBootApplication
15 //@ImportResource("classpath:config/application-user-service-dubbo.xml")
16 @MapperScan(basePackages= {"com.sharp.forward.mapper"})
17 @EnableAutoConfiguration
18 public class Application implements CommandLineRunner{
19     
20     private static final Logger log = LoggerFactory.getLogger(Application.class);
21     public static void main(String[] args) {
22         SpringApplication.run(Application.class, args);
23     }
24 
25     @Autowired
26     private RabbitMQProperties rabbitMQProperties;
27     /**
28      * @param args
29      * @throws Exception
30      */
31     @Override
32     public void run(String... args) throws Exception {
33          String config = "host: " + rabbitMQProperties.getHost()
34          + ", config.port:" + rabbitMQProperties.getPort() 
35          + ", config.userName:" + rabbitMQProperties.getUserName();
36 
37 log.info("SpringBoot2.0實現自定義properties配置文件與JavaBean映射:" + config);
38         
39     }
40     
41 }

再次啟動如下: 

說明屬性值已經讀取。

 同樣將屬性bean修改為如下也不能在在初始化中為靜態變量賦值

 1 /**
 2  * 
 3  */
 4 package com.sharp.forward.config;
 5 
 6 import org.springframework.beans.factory.annotation.Value;
 7 import org.springframework.boot.context.properties.ConfigurationProperties;
 8 import org.springframework.context.annotation.Configuration;
 9 import org.springframework.context.annotation.PropertySource;
10 import org.springframework.stereotype.Component;
11 
12 /**
13  * @author 醉逍遙
14  *
15  */
16 @Component
17 @ConfigurationProperties(prefix="rabbit.config")
18 @PropertySource(value="classpath:config/rabbitmq.properties",encoding="utf-8")
19 public class RabbitMQProperties {
20     
21     private static String host;
22     
23     private static int port;
24     
25     private static String userName;
26     
27     private static String password;
28     
29     public static String getHost() {
30         return host;
31     }
32     @Value(value="${host}")
33     public static void setHost(String host) {
34         RabbitMQProperties.host = host;
35         System.out.println("host----------->"+host);
36     }
37     public static int getPort() {
38         return port;
39     }
40     @Value(value="${rabbit.config.port}")
41     public static void setPort(int port) {
42         RabbitMQProperties.port = port;
43         System.out.println("port----------->"+port);
44     }
45     public static String getUserName() {
46         return userName;
47     }
48     @Value(value="${userName}")
49     public static void setUserName(String userName) {
50         RabbitMQProperties.userName = userName;
51     }
52     public static String getPassword() {
53         return password;
54     }
55     public static void setPassword(String password) {
56         RabbitMQProperties.password = password;
57     }
58     
59 }

運行結果同樣都是空或0;

參考https://www.cnblogs.com/hsz-csy/p/9625950.html,可以解決為靜態變量賦值的問題,set方法一定要是非靜態的

修改為

/**
 * 
 */
package com.sharp.forward.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * @author 醉逍遙
 *
 */
@Component
@ConfigurationProperties(prefix="rabbit.config")
@PropertySource(value="classpath:config/rabbitmq.properties",encoding="utf-8")
public class RabbitMQProperties {
    
    private static String host;
    
    private static int port;
    
    private static String userName;
    
    private static String password;
    
    public static String getHost() {
        return host;
    }
    @Value(value="${host}")
    public static void setHost(String host) {
        RabbitMQProperties.host = host;
        System.out.println("host----------->"+host);
    }
    public static int getPort() {
        return port;
    }
    @Value(value="${rabbit.config.port}")
    public void setPort(int port) {
        RabbitMQProperties.port = port;
        System.out.println("port----------->"+port);
    }
    public static String getUserName() {
        return userName;
    }
    @Value(value="${userName}")
    public void setUserName(String userName) {
        RabbitMQProperties.userName = userName;
    }
    public static String getPassword() {
        return password;
    }
    public static void setPassword(String password) {
        RabbitMQProperties.password = password;
    }
    
}

其他不變,

com.sharp.forward.Application - SpringBoot2.0實現自定義properties配置文件與JavaBean映射:host: null, config.port:5672, config.userName:guest

host沒取到是因為value中路徑寫個重復前綴的實驗用了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM