Chèn Mảng và Danh sách Từ các tệp thuộc tính Spring

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ tìm hiểu cách đưa giá trị vào một mảng hoặc Danh sách từ tệp thuộc tính Spring.

2. Hành vi mặc định

Chúng ta sẽ bắt đầu với một tệp application.properties đơn giản :

arrayOfStrings=Baeldung,dot,com

Hãy xem Spring hoạt động như thế nào khi chúng ta đặt loại biến của mình thành String [] :

@Value("${arrayOfStrings}") private String[] arrayOfStrings;
@Test void whenContextIsInitialized_thenInjectedArrayContainsExpectedValues() { assertEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings); }

Chúng ta có thể thấy rằng Spring giả định chính xác dấu phân cách của chúng ta là dấu phẩy và khởi tạo mảng tương ứng.

Chúng ta cũng nên lưu ý rằng, theo mặc định, việc chèn một mảng chỉ hoạt động chính xác khi chúng ta có các giá trị được phân tách bằng dấu phẩy.

3. Danh sách Tiêm

Nếu chúng tôi cố gắng đưa vào một Danh sách theo cách tương tự, chúng tôi sẽ nhận được một kết quả đáng ngạc nhiên:

@Value("${arrayOfStrings}") private List unexpectedListOfStrings;
@Test void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() { assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings); }

Danh sách của chúng tôi chứa một phần tử duy nhất, bằng với giá trị mà chúng tôi đặt trong tệp thuộc tính của mình.

Để đưa vào Danh sách một cách chính xác , chúng ta cần sử dụng cú pháp đặc biệt được gọi là Ngôn ngữ biểu thức mùa xuân (SpEL):

@Value("#{'${arrayOfStrings}'.split(',')}") private List listOfStrings;
@Test void whenContextIsInitialized_thenInjectedListContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }

Chúng ta có thể thấy rằng biểu thức của chúng ta bắt đầu bằng # thay vì $ mà chúng ta đã quen với @Value .

Chúng ta cũng nên lưu ý rằng chúng ta đang gọi phương thức phân tách , phương thức này làm cho biểu thức phức tạp hơn một chút so với phương thức tiêm thông thường.

Nếu chúng ta muốn giữ cho biểu thức của mình đơn giản hơn một chút, chúng ta có thể khai báo thuộc tính của mình ở một định dạng đặc biệt:

listOfStrings={'Baeldung','dot','com'}

Spring sẽ nhận ra định dạng này và chúng tôi sẽ có thể đưa vào Danh sách của mình bằng cách sử dụng một biểu thức đơn giản hơn một chút:

@Value("#{${listOfStrings}}") private List listOfStringsV2;
@Test void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2); }

4. Sử dụng Dấu phân cách tùy chỉnh

Hãy tạo một thuộc tính tương tự, nhưng lần này, chúng ta sẽ sử dụng một dấu phân cách khác:

listOfStringsWithCustomDelimiter=Baeldung;dot;com

Như chúng ta đã thấy khi đưa vào Danh sách , chúng ta có thể sử dụng một biểu thức đặc biệt, nơi chúng ta có thể chỉ định dấu phân cách mong muốn của mình:

@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}") private List listOfStringsWithCustomDelimiter;
@Test void whenContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter); }

5. Tiêm các loại khác

Chúng ta hãy xem xét các thuộc tính sau:

listOfBooleans=false,false,true listOfIntegers=1,2,3,4 listOfCharacters=a,b,c

Chúng ta có thể thấy rằng Spring hỗ trợ các kiểu cơ bản bên ngoài, vì vậy chúng ta không cần thực hiện bất kỳ phân tích cú pháp đặc biệt nào:

@Value("#{'${listOfBooleans}'.split(',')}") private List listOfBooleans; @Value("#{'${listOfIntegers}'.split(',')}") private List listOfIntegers; @Value("#{'${listOfCharacters}'.split(',')}") private List listOfCharacters;
@Test void whenContextIsInitialized_thenInjectedListOfBasicTypesContainsExpectedValues() { assertEquals(Arrays.asList(false, false, true), listOfBooleans); assertEquals(Arrays.asList(1, 2, 3, 4), listOfIntegers); assertEquals(Arrays.asList('a', 'b', 'c'), listOfCharacters); }

Điều này chỉ được hỗ trợ qua SpEL, vì vậy chúng tôi không thể chèn một mảng theo cách tương tự.

6. Đọc thuộc tính theo chương trình

Để đọc các thuộc tính theo chương trình, trước tiên chúng ta cần lấy thể hiện của đối tượng Môi trường của chúng ta :

@Autowired private Environment environment;

Sau đó, chúng ta có thể chỉ cần sử dụng phương thức getProperty để đọc bất kỳ thuộc tính nào bằng cách chỉ định khóa và kiểu mong đợi của nó:

@Test void whenReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues() { String[] arrayOfStrings = environment.getProperty("arrayOfStrings", String[].class); List listOfStrings = (List)environment.getProperty("arrayOfStrings", List.class); assertEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings); assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }

7. Kết luận

Trong hướng dẫn nhanh này, chúng ta đã học cách dễ dàng chèn mảng và Danh sách thông qua các ví dụ nhanh và thực tế.

Như mọi khi, mã có sẵn trên GitHub.