在Spring Boot中使用 @ConfigurationProperties 和 @EnableConfigurationProperties

注:以下为springboot1.5版本以前的教程。springboot1.5及以后版本中@ConfigurationProperties注解取消了locations属性,若要手动指定配置文件,请点链接看另一篇博文https://blog.csdn.net/wqh0830/article/details/103697246

Spring Boot 使用一些轻松的规则来绑定属性到@ConfigurationProperties bean 并且支持分层结构(hierarchical structure)。
开始创建一个@ConfigurationProperties bean:

@ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")
public class MailProperties {
    private String host;
    private int port;
    private String from;
    private String username;
    private String password;
    private Smtp smtp;

    // ... getters and setters
    
    @Override
    public String toString() {
        return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" + username
                + ", password=" + password + ", smtp=" + smtp + "]";
    }

    public static class Smtp {
        private boolean auth;
        private boolean starttlsEnable;
        
        // ... getters and setters

    }
}

创建mail.properties:

mail.host=localhost
mail.port=25
mail.smtp.auth=false
mail.smtp.starttls-enable=false
mail.from=me@localhost
mail.username=duan
mail.password=duan123456

上例中我们用@ConfigurationProperties注解就可以绑定属性了。ignoreUnknownFields = false告诉Spring Boot在有属性不能匹配到值的时候抛出异常。开发的时候很方便! prefix 用来选择哪个属性的prefix名字来绑定。
请注意setters 和 getters 需要在@ConfigurationProperties bean中创建! 与@Value注解相反。

方案1:@Component + @ConfigurationProperties

package com.dxz.property3;

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

@Component
@ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")
public class MailProperties {
    private String host;
    private int port;
    private String from;
    private String username;
    private String password;
    private Smtp smtp;

    // ... getters and setters
    
    @Override
    public String toString() {
        return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" + username
                + ", password=" + password + ", smtp=" + smtp + "]";
    }

    public static class Smtp {
        private boolean auth;
        private boolean starttlsEnable;

    }
}

启动及测试类:

package com.dxz.property3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class TestProperty3 {

    @Autowired
    private MailProperties mailProperties;
    
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public String hello() {
        System.out.println("mailProperties" + mailProperties);
        return "hello world";
    }

    public static void main(String[] args) {
        //SpringApplication.run(TestProperty1.class, args);
        new SpringApplicationBuilder(TestProperty3.class).web(true).run(args);

    }
}

结果:

mailPropertiesMailProperties [host=localhost, port=25, from=me@localhost, username=duan, password=duan123456, smtp=com.dxz.property3.MailProperties$Smtp@37cebacb]

方案2:@Bean + @ConfigurationProperties

我们还可以把@ConfigurationProperties直接定义在@bean的注解上,这时bean实体类就不用@Component和@ConfigurationProperties了

package com.dxz.property4;


public class MailProperties {
    private String host;
    private int port;
    private String from;
    private String username;
    private String password;
    private Smtp smtp;

    // ... getters and setters
    
    @Override
    public String toString() {
        return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" + username
                + ", password=" + password + ", smtp=" + smtp + "]";
    }

    public static class Smtp {
        private boolean auth;
        private boolean starttlsEnable;

    }
}

启动类:

@SpringBootApplication
public class TestProperty4 {

    @Bean
    @ConfigurationProperties(locations = "classpath:mail.properties", prefix = "mail")
    public MailProperties mailProperties(){
        MailProperties mp = new MailProperties();
        System.out.println("zheli " + mp);
        return mp;

    }

    public static void main(String[] args) {
        //SpringApplication.run(TestProperty1.class, args);
        new SpringApplicationBuilder(TestProperty4.class).web(true).run(args);

    }
}

测试类:

@RestController
@RequestMapping("/task")
public class TaskController {

    @Autowired 
    MailProperties mailProperties;

    @RequestMapping(value = {"/",""})
    public String hellTask(){
        System.out.println("mailProperties" +mailProperties);  
        return "hello task !!";
    }

}

结果:

方案3:@ConfigurationProperties + @EnableConfigurationProperties

我们和上面例子一样注解属性,然后用 Spring的@Autowire来注入 mail configuration bean:

@ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")
public class MailProperties {
    private String host;
    private int port;
    private String from;
    private String username;
    private String password;
    private Smtp smtp;

    // ... getters and setters
    
    @Override
    public String toString() {
        return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" + username
                + ", password=" + password + ", smtp=" + smtp + "]";
    }

    public static class Smtp {
        private boolean auth;
        private boolean starttlsEnable;

    }
}

启动类及测试类:

@RestController
@SpringBootApplication
@EnableConfigurationProperties(MailProperties.class)
public class TestProperty1 {

    @Autowired
    private MailProperties mailProperties;
    
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public String hello() {
        System.out.println("mailProperties" + mailProperties);
        return "hello world";
    }

    public static void main(String[] args) {
        //SpringApplication.run(TestProperty1.class, args);
        new SpringApplicationBuilder(TestProperty1.class).web(true).run(args);

    }
}

结果:

请注意@EnableConfigurationProperties注解。该注解是用来开启对@ConfigurationProperties注解配置Bean的支持。也就是@EnableConfigurationProperties注解告诉Spring Boot 能支持@ConfigurationProperties。如果不指定会看到如下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.dxz.property.MailProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值