springboot 中bean定义好了,通过配置文件给bean注入数据如何实现呢?
为省事,我直接把官方的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("acme")
public class AcmeProperties {
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) { ... }
}
}
既然类加了注解@ConfigurationProperties("acme") ,所以我们在resource下面定义一个配置文件application.yaml,内容如下:
个人比较喜欢yaml,简洁可读性更高。在写配置文件时,有时bean的属性非常多不好记,那么可以通过提示更方便,如下:
需要在pom.xml中增加如下依赖,建议放在project的pom.xml中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
另外,如果bean属性较多时,get set 方法也非常之多,看起来很笨重,也有一个办法可以使代码看起来更简洁,如下操作:
(1)需要在pom.xml中增加如下依赖,建议放在project的pom.xml中:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
(2)在类上加上注解@Data,如果有内部类也要加上@Data,如下所示:
本文主要是做个笔记,如何更方便的根据bean定义写配置文件,以实现注入,其实就是加上两个依赖:spring-boot-configuration-processor 和 lombok
注意:上面的例子也可以通过构造绑定以实现数据的注入,代码修改如下:
package com.wz.controller;
import com.wz.model.AcmeProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableConfigurationProperties(AcmeProperties.class)
public class PropertiesController {
@Autowired
private AcmeProperties properties;
@RequestMapping("constructorbinding")
public AcmeProperties prop(){
return properties;
}
}
package com.wz.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Data
@ConstructorBinding
@ConfigurationProperties("acme")
public class AcmeProperties {
private boolean enabled;
private InetAddress remoteAddress;
private final Security security = new Security();
@Data
public static class Security {
private String username;
private String password;
private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
}
}