码迷,mamicode.com
首页 > 编程语言 > 详细

springboot 外部配置<下篇> 类型安全配置

时间:2017-09-16 14:59:49      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:col   mys   example   需要   str   ddr   mvc   .config   集合   

 

使用@Value注解注入配置在一些情况下是很笨重的,尤其是在多重配置或者垂直数据的情况下。Spring提供可选的方法,有力地归类配置到bean当中,以便管理和校验配置。

package com.example;

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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

@ConfigurationProperties("foo")
public class FooProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private final Security security = new Security();

    public boolean isEnabled() { ... }

    public void setEnabled(boolean enabled) { ... }

    public InetAddress getRemoteAddress() { ... }

    public void setRemoteAddress(InetAddress remoteAddress) { ... }

    public Security getSecurity() { ... }

    public static class Security {

        private String username;

        private String password;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List<String> getRoles() { ... }

        public void setRoles(List<String> roles) { ... }

    }
}

上面的POJO定义以下几个属性:

foo.enabled,默认false

foo.remote-address,可以从String强转的类型

foo.security.username,按某个规则确定的字符串

foo.security.password

foo.security.roles 一个String List

getter 和 setter 通常是必要的,绑定原理跟SpingMvc中数据绑定大致一样的,根据属性名绑定。但有时候也会setter也会被忽略的。

(1)Map,一开始初始化时候已经足够长了,因此只需要getter就行了。

(2)集合通常不用getter。

(3)如果一个普通POJO被初始化了,也不需要getter。

你还要通过@EnableConfigurationProperties注册属性类。

@Configuration
@EnableConfigurationProperties(FooProperties.class)
public class MyConfiguration {
}

当 @ConfigurationProperties 注解的bean注册之后,该bean将会有一个全名:<prefix>-<fqn>,<prefix>是@ConfigurationProperties注解中的prefix值,<fqn>是bean的类全名。如果该注解没有提供prefix,则只有类的全名,如foo-com.example.FooProperties

即使上面的配置创建了bean,我们要确定的是@ConfigurationProperties仅仅处理了Spring环境,特别是没从Context注入其他的Bean。@EnableConfigurationProperties注解同时会自动向应用提交申请,使得程序自动向环境中注入所有@ConfigurationProperties注解的Bena。你可以用快捷方式来保证FooProperties已经是个bean。

@Component
@ConfigurationProperties(prefix="foo")
public class FooProperties {

    // ... see above

}

利用配置文件

# application.yml

foo:
    remote-address: 192.168.1.1
    security:
        username: foo
        roles:
          - USER
          - ADMIN

# additional configuration as required

也通过可以在代码中注入Bean来实现

@Service
public class MyService {

    private final FooProperties properties;

    @Autowired
    public MyService(FooProperties properties) {
        this.properties = properties;
    }

     //...

    @PostConstruct
    public void openConnection() {
        Server server = new Server(this.properties.getRemoteAddress());
        // ...
    }

}

 1、第三方配置

和@ConfigurationProperties一样,你可以使用@Bean,这在你绑定属性值到你不能控制的第三方组件的时候很有用的。

添加配置@ConfigurationProperties到相应的Bean上,可以把环境属性配置到Bean。

@ConfigurationProperties(prefix = "bar")
@Bean
public BarComponent barComponent() {
    ...
}

任何配置在prefix=bar里面的属性都会映射到BarComponent对应的属性上。

springboot 外部配置<下篇> 类型安全配置

标签:col   mys   example   需要   str   ddr   mvc   .config   集合   

原文地址:http://www.cnblogs.com/qins/p/7531157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!