1. 程式人生 > >Spring boot將配置屬性注入到bean類中

Spring boot將配置屬性注入到bean類中

一、@ConfigurationProperties註解的使用


看配置檔案,我的是yaml格式的配置:

// file application.yml
my:
  servers:
    - dev.bar.com
    - foo.bar.com
    - jiaobuchong.com

下面我要將上面的配置屬性注入到一個Java Bean類中,看碼:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import
java.util.ArrayList; import java.util.List; /** * file: MyConfig.java * Created by jiaobuchong on 12/29/15. */ @Component //不加這個註解的話, 使用@Autowired 就不能注入進去了 @ConfigurationProperties(prefix = "my") // 配置檔案中的字首 public class MyConfig { private List<String> servers = new ArrayList<String>(); public
List<String> getServers() { return this.servers; } }

下面寫一個Controller來測試一下:

/**
 * file: HelloController
 * Created by jiaobuchong on 2015/12/4.
 */
@RequestMapping("/test")
@RestController
public class HelloController {
    @Autowired
    private MyConfig myConfig;

    @RequestMapping("/config"
) public Object getConfig() { return myConfig.getServers(); } }

下面執行Application.java的main方法跑一下看看:

@Configuration   //標註一個類是配置類,spring boot在掃到這個註解時自動載入這個類相關的功能,比如前面的文章中介紹的配置AOP和攔截器時加在類上的Configuration
@EnableAutoConfiguration  //啟用自動配置 該框架就能夠進行行為的配置,以引導應用程式的啟動與執行, 根據匯入的starter-pom 自動載入配置
@ComponentScan  //掃描元件 @ComponentScan(value = "com.spriboot.controller") 配置掃描元件的路徑
public class Application {
    public static void main(String[] args) {
        // 啟動Spring Boot專案的唯一入口
        SpringApplication app = new SpringApplication(Application.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
    }

在瀏覽器的位址列裡輸入:
localhost:8080/test/config 得到:
[“dev.bar.com”,”foo.bar.com”,”jiaobuchong.com”]

二、@ConfigurationProperties和@EnableConfigurationProperties註解結合使用


在spring boot中使用yaml進行配置的一般步驟是,
1、yaml配置檔案,這裡假設:

my:
  webserver:
    #HTTP 監聽埠
    port: 80
    #嵌入Web伺服器的執行緒池配置
    threadPool:
      maxThreads: 100
      minThreads: 8
      idleTimeout: 60000

2、

//file MyWebServerConfigurationProperties.java
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "my.webserver")
public class MyWebServerConfigurationProperties {
    private int port;
    private ThreadPool threadPool;

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public ThreadPool getThreadPool() {
        return threadPool;
    }

    public void setThreadPool(ThreadPool threadPool) {
        this.threadPool = threadPool;
    }

    public static class ThreadPool {
        private int maxThreads;
        private int minThreads;
        private int idleTimeout;

        public int getIdleTimeout() {
            return idleTimeout;
        }

        public void setIdleTimeout(int idleTimeout) {
            this.idleTimeout = idleTimeout;
        }

        public int getMaxThreads() {
            return maxThreads;
        }

        public void setMaxThreads(int maxThreads) {
            this.maxThreads = maxThreads;
        }

        public int getMinThreads() {
            return minThreads;
        }

        public void setMinThreads(int minThreads) {
            this.minThreads = minThreads;
        }
    }
}

3、

// file: MyWebServerConfiguration.java
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@Configuration
@EnableConfigurationProperties(MyWebServerConfigurationProperties.class)
public class MyWebServerConfiguration {
    @Autowired
    private MyWebServerConfigurationProperties properties;
    /**
     *下面就可以引用MyWebServerConfigurationProperties類       裡的配置了
    */
   public void setMyconfig() {
       String port = properties.getPort();
       // ...........
   }   
}


The @EnableConfigurationProperties annotation is automatically applied to your project so that any beans annotated with @ConfigurationProperties will be configured from the Environment properties. This style of configuration works particularly well with the SpringApplication external YAML configuration.(引自spring boot官方手冊)

三、@Bean配置第三方元件(Third-party configuration)

建立一個bean類:

// file ThreadPoolBean.java
/**
 * Created by jiaobuchong on 1/4/16.
 */
public class ThreadPoolBean {
    private int maxThreads;
    private int minThreads;
    private int idleTimeout;

    public int getMaxThreads() {
        return maxThreads;
    }

    public void setMaxThreads(int maxThreads) {
        this.maxThreads = maxThreads;
    }

    public int getMinThreads() {
        return minThreads;
    }

    public void setMinThreads(int minThreads) {
        this.minThreads = minThreads;
    }

    public int getIdleTimeout() {
        return idleTimeout;
    }

    public void setIdleTimeout(int idleTimeout) {
        this.idleTimeout = idleTimeout;
    }
}

引用前面第二部分寫的配置類:MyWebServerConfiguration.java和MyWebServerConfigurationProperties.java以及yaml配置檔案,現在修改MyWebServerConfiguration.java類:

import com.jiaobuchong.springboot.domain.ThreadPoolBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by jiaobuchong on 1/4/16.
 */
@Configuration  //這是一個配置類,與@Service、@Component的效果類似。spring會掃描到這個類,@Bean才會生效,將ThreadPoolBean這個返回值類註冊到spring上下文環境中
@EnableConfigurationProperties(MyWebServerConfigurationProperties.class) //通過這個註解, 將MyWebServerConfigurationProperties這個類的配置到上下文環境中,本類中使用的@Autowired註解注入才能生效
public class MyWebServerConfiguration {
    @SuppressWarnings("SpringJavaAutowiringInspection") //加這個註解讓IDE 不報: Could not autowire
    @Autowired
    private MyWebServerConfigurationProperties properties;

    @Bean //@Bean註解在方法上,返回值是一個類的例項,並宣告這個返回值(返回一個物件)是spring上下文環境中的一個bean
    public ThreadPoolBean getThreadBean() {
        MyWebServerConfigurationProperties.ThreadPool threadPool = properties.getThreadPool();
        ThreadPoolBean threadPoolBean = new ThreadPoolBean();
        threadPoolBean.setIdleTimeout(threadPool.getIdleTimeout());
        threadPoolBean.setMaxThreads(threadPool.getMaxThreads());
        threadPoolBean.setMinThreads(threadPool.getMinThreads());
        return threadPoolBean;
    }
}

被@Configuration註解標識的類,通常作為一個配置類,這就類似於一個xml檔案,表示在該類中將配置Bean元資料,其作用類似於Spring裡面application-context.xml的配置檔案,而@Bean標籤,則類似於該xml檔案中,宣告的一個bean例項。
寫一個controller測試一下:

import com.jiaobuchong.springboot.domain.ThreadPoolBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by jiaobuchong on 2015/12/4.
 */
@RequestMapping("/first")
@RestController
public class HelloController {
    @Autowired
    private ThreadPoolBean threadPoolBean;
    @RequestMapping("/testbean")
    public Object getThreadBean() {
        return threadPoolBean;
    }

}


執行Application.java的main方法,
在瀏覽器裡輸入:http://localhost:8080/first/testbean
得到的返回值是:
{“maxThreads”:100,”minThreads”:8,”idleTimeout”:60000}

ok,fucking nice

相關推薦

Spring boot配置屬性注入bean

一、@ConfigurationProperties註解的使用 看配置檔案,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.com - foo.bar.co

Spring-boot-admin配置屬性詳解

使用到了springbootAdmin這個工具,但是有關它們的配置不太理解。下面是我對照著官網的說明以及自己的理解總結的,如果有不正確的地方歡迎大家指正。(我這裡只是在springboot中使用了SBA,還沒有涉及到其它更加高階的spring cloud等。這裡的屬性也只是最

spring boot 學習(三) — 依賴注入 @Bean

spring 4推薦的@Configuration 和@bean 的用法,這樣我們可以省去繁瑣的配置檔案 第一步 建一個Maven工程 第二步新增依賴  pom.xml <?xml version="1.0" encoding="UTF-8"?> <pro

Spring Boot 配置檔案放到jar外部

如果不想使用預設的application.properties,而想將屬性檔案放到jar包外面,可以使用如下兩種方法: 只能設定全路徑。因為Java -jar執行jar包時,無法指定classpath(無論通過引數還是環境變數,設定的classpath都會被覆蓋)。

Spring Boot通過ImportBeanDefinitionRegistrar動態注入Bean

在閱讀Spring Boot原始碼時,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar來實現Bean的動態注入。它是Spring中一個強大的擴充套件介面。本篇文章來講講它相關使用。 Spring Boot中的使用 在Spring Boot 內建容器的相關自動配置中

spring boot配置文件 application.properties 屬性解析

date hiberna mage ida str 數據丟失 art rop 就會 1.JPA命名策略 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.DefaultNamingStrategy 有兩種值

記錄Spring Boot大坑一個,在bean如果有@Test單元測試,不會注入成功

記錄Spring Boot大坑一個,在bean中如果有@Test單元測試,不會注入成功 記錄Spring Boot大坑一個,在bean中如果有@Test單元測試,不會注入成功 記錄Spring Boot大坑一個,在bean中如果有@Test單元測試,不會注入成功 org.springframework.

Spring註解注入bean配置檔案注入bean

註解的方式確實比手動寫xml檔案注入要方便快捷很多,省去了很多不必要的時間去寫xml檔案 按以往要注入bean的時候,需要去配置一個xml,當然也可以直接掃描包體,用xml注入bean有以下方法: 1 <?xml version="1.0" encoding="UTF-8"?> 2

Spring Boot資原始檔屬性配置

一 新增相關依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-proce

spring boot陣列型屬性配置

spring boot普通屬性配置非常方便 通過@value(${屬性名稱})就可以繫結到相關的屬性值.但是對於某些比較複雜的物件屬性配置且改物件數目不確定時通過固定的屬性名配置顯然有太複雜,通過list結合map可以較為靈活的對這類物件進行配置範例如下: @Configu

Spring4x和Spring Boot推薦配置的方式管理Bean?

Spring4x和Spring Boot推薦配置的方式管理Bean。 --reading 《Spring Boot實戰》。 Java配置是通過@Configuration & @Bean來實現的。 @Configuration 聲明當前類是一個配置類,相當於一個Spring配置的xml

Spring Boot: Yaml配置檔案 以及 @ConfigurationProperties屬性獲取

Yaml配置檔案 概述 Spring Boot在支援application.properties配置檔案的同時,也支援application.yaml配置檔案. 配置檔案中的屬性,可以通過: 通過@Value註解將屬性值注入Bean中; 通過@ConfigurationProperties註解

阿里druid-spring-boot-starter 配置(配置完成後不需要在配置寫)根據阿里官方個人整理

# JDBC 配置(驅動類自動從url的mysql識別,資料來源型別自動識別) # 或spring.datasource.url= spring.datasource.druid.url=jdbc:mysql://192.168.1.1:3306/test?useUnicode=true&c

Spring Boot 讀取配置檔案到靜態工具

1.靜態工具類中 @Component public class EntityListUtils { private static final Logger logger = LoggerFactory.getLogger(EntityListUtils.class); @Au

spring boot(18)配置檔案值注入[

1、application.properties配置檔案 clockbone.name=zhangsan clockbone.age=10 clockbone.job=1 #注入Map clockbone.map.k1=v1 clockbone.map.k2=v2 clockbone

Spring-Boot基於配置按條件裝Bean

啟動 簡單的 esp www 主鍵 cte template str prop 背景    同一個接口有多種實現,項目啟動時按某種規則來選擇性的啟用其中一種實現,再具體一點,比如Controller初始化的時候,根據配置文件的指定的實現類前綴,來記載具體Service,不同

Spring Boot自動配置(Auto-Configuration),@EnableAutoConfiguration,Spring Beans和依賴注入

自動配置(Auto-Configuration) 自動配置(auto-configuration)是Spring Boot最重要的特性之一,因為該特性會根據應用的classpath(這個主要是根據maven pom.xml決定),annotations和其他的

spring boot 讀取配置檔案(application.yml)屬性

在spring boot中,簡單幾步,讀取配置檔案(application.yml)中各種不同型別的屬性值: 1、引入依賴: <!-- 支援 @ConfigurationProperties

Spring Boot 第三方依賴和配置檔案打包在jar外部並引用

pom.xml檔案中新增 <build> <plugins> <plugin> <groupId>org.apache.mave

Spring注入屬性 在子呼叫為null

在spring中注入屬性的目標是例項而不是類 子類從父類繼承的值是與例項無關的 所以子類的屬性並沒有被賦值 工作背景: 有一個BaseService 有3個Dao成員 DaoA DaoB DaoC 並且 spring 為這3個成員分別注入了值 這三個Dao是直接可以拿過來執