
SpringBoot中想要從Application.properties中取的值,有兩種常見的方式,其中一種是利用@Value的方式
@Value
| 1
2
 | @Value("${app.version})
String version
 | 
Enviroment
另一種則是透過 Enviroment物件來取的
| 1
2
3
4
5
 | private final Environment env;
public String getAppVersion() {
        return environment.getProperty("app.version");
    }
 | 
以取值的表現形式來看
在某些情形下,我們可能會從applicaiton.properties中取出一個陣列值,比如說
這時如果使用Enviroment來取,取出來的值會一個String,需要再透過轉換,將它變為一個String
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 | @Autowired
private Environment env;
public String[] getMyArrayProperty() {
    String propertyValue = env.getProperty("my.array.property");
    if (propertyValue != null) {
        return propertyValue.split(",");
    } else {
        return new String[0];
    }
}
 | 
但如果用@Value的方式來取值,則可以在宣告變數時,聲明它是一個String或是一個String[],避免後續的轉換
| 1
2
 | @Value("${language}")
private String[] myArray;
 | 
以單元測試角度來看
這兩個表現形式幾乎一模一樣,都可以取得想要的部分,但最大差別就在單元測試時,由於@Value這個取值方式有賴將整個SpringBoot專案啟動才可以注入,在單元測試的環境下並沒有辦法做到這件事情。但相反的,由於Environment本身屬於一個外部依賴,我們可以很好的替代掉他
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 | @Service
public class VersionService {
    Environment environment;
    public VersionService(Environment environment) {
        this.environment = environment;
    }
    public String getEunoExAppVersion() {
        return environment.getProperty("eunoex.version");
    }
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 | @ExtendWith(MockitoExtension.class)
class VersionServiceTest {
    @Mock
    Environment environment;
    @InjectMocks
    VersionService versionService;
    @Test
    void getAppVersion_everythingFine_returnSuccessfully() {
        given(environment.getProperty(any())).willReturn("v1.2.0");
        String ExAppVersion = versionService.getAppVersion();
        System.out.println("AppVersion = " + AppVersion);
    }
}
 | 
大概Guy4這樣