1. 程式人生 > >使用 @ConfigurationProperties 注入配置資訊之二

使用 @ConfigurationProperties 注入配置資訊之二

在上一篇部落格中,我們的屬性配置類FooProperties通過使用@ConfigurationProperties註解實現了配置資訊的注入;然後又通過使用@EnableConfigurationProperties註解才使得配置bean被創建出來。其實,@EnableConfigurationProperties這個註解也會自動應用到專案中,同時,系統中任何被 @ConfigurationProperties 標註的“已經存在”的 bean 都會從系統環境中載入配置資訊。也就是說,我們可以像下面這樣簡化上一篇部落格中的配置。

  • 配置資訊
# ConfigurationProperties 學習,見 spring boot 文件第 24.7小節
foo.enabled=false
foo.remote-address=192.168.1.1
foo.security.username=user
foo.security.password=pwd
foo.security.roles=USER,ADMIN
  • 屬性配置類 - bean
/**
 * 對比 {@link FooProperties}
 * 
 * 事實上,{@link EnableConfigurationProperties} 已經自動將 Environment
 * 
 * 中的配置應用到了被 {@link ConfigurationProperties} 註解的"bean"上
 * 
 * 所以該類的配置等同於 {@link FooProperties} 和 {@link TestPropertiesConfiguration} 的組合配置
 */
@Component
@ConfigurationProperties(prefix = "foo")
public class BarProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private Security security;

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public InetAddress getRemoteAddress() {
        return remoteAddress;
    }

    public void setRemoteAddress(InetAddress remoteAddress) {
        this.remoteAddress = remoteAddress;
    }

    public Security getSecurity() {
        return security;
    }

    public void setSecurity(Security security) {
        this.security = security;
    }

    public static class Security {

        private String username;

        private String password;

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

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public List<String> getRoles() {
            return roles;
        }

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

        @Override
        public String toString() {
            return "{ " + "username='" + username + '\'' + ", password='" + password + '\'' + " }";
        }
    }

    @Override
    public String toString() {
        return "{ " + "enabled=" + enabled + ", remoteAddress=" + remoteAddress + ", security="
                + security + " }";
    }
}
  • 例項化屬性配置bean
@Service
public class BarServiceImpl implements BarService {

    private static final Logger logger = LoggerFactory.getLogger(BarServiceImpl.class);

    private BarProperties barProperties;

    @Autowired
    public BarServiceImpl(BarProperties barProperties) {
        this.barProperties = barProperties;
    }

    /**
     * 這個註解在這裡沒實際用處,就是為了方便在該類構造完成後列印日誌,看看配置資訊是否載入到配置類中了
     */
    @PostConstruct
    public void verifyConfigurationProperties() {
        logger.info("BarProperties: {}", barProperties);
    }
}
  • 驗證配置資訊是否載入到屬性配置bean中
    驗證配置資訊是否載入到屬性配置bean中