Spring: Làm thế nào để đưa một giá trị vào trường tĩnh?


91

Với lớp học này

@Component
public class Sample {

    @Value("${my.name}")
    public static String name;


}

Nếu tôi cố gắng Sample.name, nó luôn là 'null'. Vì vậy, tôi đã thử điều này.

public class Sample {

    public static String name;

    @PostConstruct
    public void init(){
        name = privateName;
    }

    @Value("${my.name}")
    private String privateName;

    public String getPrivateName() {
        return privateName;
    }

    public void setPrivateName(String privateName) {
        this.privateName = privateName;
    }  

}

Mã này hoạt động. Sample.nameđược đặt đúng cách. Cách này có tốt hay không? Nếu không, có cách nào tốt hơn không? Và làm thế nào để làm điều đó?


Điều này sẽ không giải quyết; nếu biến static được sử dụng trước khi tạo đối tượng. Ví dụ) nếu biến static được sử dụng trong khối static để xây dựng tài nguyên, thì tài nguyên sẽ được xây dựng bằng null.
Kanagavelu Sugumar

Câu trả lời:


115

Trước hết, public staticphi finaltrường là ác . Mùa xuân không cho phép tiêm vào các trường như vậy là có lý do.

Cách giải quyết của bạn là hợp lệ, bạn thậm chí không cần getter / setter, privatetrường là đủ. Mặt khác, hãy thử điều này:

@Value("${my.name}")
public void setPrivateName(String privateName) {
    Sample.name = privateName;
}  

(hoạt động với @Autowired/ @Resource). Nhưng để cung cấp cho bạn một số lời khuyên mang tính xây dựng: Tạo một lớp thứ hai với privatefield và getter thay vì public staticfield.


9
Đối với "public static non-final fields is evil", bạn có thể vui lòng cho tôi một số tài liệu tham khảo được không?
Anderson

7
Không cuối cùng có nghĩa là bạn có thể sửa đổi giá trị trường, đối với trường tĩnh, ngụ ý xử lý đồng thời luồng - hay còn gọi là giá trị trong ngăn xếp.
Xavier Portebois,

Làm thế nào để sử dụng @Value với khối tĩnh? Vui lòng hướng dẫn chúng ta ... Kính trọng, Neha

4
Just FYI: Đoạn mã trên sẽ gây ra vi phạm Sonar / Checkstyle (nếu bạn bận tâm về điều đó) vì bạn có một phương thức cá thể ghi vào một trường tĩnh.
Neil

Có thể bắt chước khía cạnh cuối cùng bằng cách sử dụng setter tĩnh sẽ chỉ đặt giá trị nếu nó hiện đang trống. Vì vậy, bạn chỉ cho phép một sửa đổi trường. (tất nhiên đã được đặt ở chế độ riêng tư và sử dụng getter để truy cập). Spring có thể gọi phương thức tĩnh trong giai đoạn cấu hình của mình (XML hoặc Annotation).
Walfrat

0

Đây là mã mẫu của tôi để tải biến tĩnh

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OnelinkConfig {
    public static int MODULE_CODE;
    public static int DEFAULT_PAGE;
    public static int DEFAULT_SIZE;

    @Autowired
    public void loadOnelinkConfig(@Value("${onelink.config.exception.module.code}") int code,
            @Value("${onelink.config.default.page}") int page, @Value("${onelink.config.default.size}") int size) {
        MODULE_CODE = code;
        DEFAULT_PAGE = page;
        DEFAULT_SIZE = size;
    }
}

-2

Spring sử dụng chức năng chèn phụ thuộc để điền giá trị cụ thể khi nó tìm thấy chú thích @Value. Tuy nhiên, thay vì chuyển giao giá trị cho biến cá thể, thay vào đó nó được giao cho người thiết lập ngầm định. Sau đó, trình thiết lập này sẽ xử lý tập hợp giá trị NAME_STATIC của chúng tôi.

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.