zoukankan      html  css  js  c++  java
  • Spring boot将配置属性注入到bean类中

    Spring boot将配置属性注入到bean类中

    following:https://blog.csdn.net/jiaobuchong/article/details/50442709

    一、@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} 

  • 相关阅读:
    Web用户控件
    ASP.Net状态管理读书笔记--思维导图
    网站教学 提纲总结到ajax结束后面还有
    ajax文本空输入显示用户信息
    Ajax 下拉列表联动显示
    用Ajax删除的做法
    Findora:引入保密性和可审计的区块链
    角逐云计算的“新黄金十年”,谁将胜出?
    区块链世界的中心应该是什么?
    边缘计算2.0时代存在哪些挑战?
  • 原文地址:https://www.cnblogs.com/pejsidney/p/9002390.html
Copyright © 2011-2022 走看看