Tại sao chúng ta không thể tự động truyền tải các trường tĩnh vào mùa xuân?


96

Tại sao chúng ta không thể tự động truyền tải biến cá thể tĩnh trong Spring bean. Tôi biết có một cách khác để đạt được điều này nhưng chỉ muốn biết tại sao chúng ta không thể làm theo cách dưới đây.

ví dụ

@Autowired
public static Test test;

bạn có thể cắt nhỏ một số ánh sáng theo cách thay thế mà bạn đang đề cập đến.
Samshers

Bạn có thể tự động phát tín hiệu thông qua hàm tạo hoặc sử dụng @PostConstuct
gagarwa Ngày

Câu trả lời:


69

Bởi vì việc sử dụng các trường tĩnh sẽ khuyến khích việc sử dụng các phương thức tĩnh. Và các phương pháp tĩnh là xấu xa. Mục đích chính của việc tiêm phụ thuộc là để vùng chứa tạo các đối tượng cho bạn và nối chúng. Ngoài ra, nó làm cho việc kiểm tra dễ dàng hơn.

Khi bạn bắt đầu sử dụng các phương thức tĩnh, bạn không cần phải tạo một phiên bản đối tượng nữa và việc kiểm tra sẽ khó hơn nhiều. Ngoài ra, bạn không thể tạo một số trường hợp của một lớp nhất định, mỗi trường hợp có một phụ thuộc khác nhau được đưa vào (vì trường được chia sẻ ngầm và tạo ra trạng thái toàn cục - cũng là ác).


11
Một cảnh báo cho điều này mà tôi gặp phải là trong quá trình thử nghiệm. Nếu bạn muốn sử dụng @BeforeClasstrong SpringJUnit4ClassRunner và có phương thức đó truy cập bean @Autowiredtrong thử nghiệm .. về cơ bản bạn không thể. Thật là khó chịu.
Jason Polites

4
Câu trả lời này giải thích tại sao nó shouldn "t Nhưng động cơ thực sự là khi khuôn khổ thử để dây lớp tĩnh vào một bean nó có thể được chưa nạp bởi lớp loader..
Andrea T

51
Câu trả lời này hoàn toàn vô nghĩa. Spring không áp đặt chiến lược thử nghiệm của bạn. Câu trả lời là chưa có thư viện Spring được tải khi Lớp tĩnh được khởi tạo bởi trình tải lớp.
Andrea T

7
Câu trả lời của @AndreaT phải là câu trả lời được chấp nhận.
Chirag Agrawal

3
Phương pháp tĩnh dễ kiểm tra hơn, không khó hơn. Để mùa xuân tự động tiêm các phụ thuộc có vẻ tốt nhưng đó thực sự là con đường khó hơn để thử nghiệm. Mô hình, sơ khai và bản thử nghiệm kép là mùi mã, không phải phương thức tĩnh.
mttdbrd

150

Bởi vì khi trình nạp lớp tải các giá trị tĩnh, ngữ cảnh Spring vẫn chưa được tải. Vì vậy, trình nạp lớp sẽ không đưa đúng các trường tĩnh vào bean và sẽ bị lỗi.


46
Cảm ơn vì một câu trả lời dường như thực sự trả lời câu hỏi hơn là chỉ nói lên ý kiến ​​rằng một nửa ngôn ngữ Java là một ý tưởng tồi.
Warren Dew

1
"lớp tĩnh"?
Arun Raaj,

Điều này có vẻ không đúng, vì Mockito có thể đưa các đối tượng vào các trường tĩnh, tương tự như cách mùa xuân thực hiện tự động tạo ... mặc dù tôi không biết việc triển khai có giống nhau hay không. Cần thêm thông tin.
gagarwa

Mockito không thể giả lập các phương thức tĩnh. Bạn cần phải sử dụng các phương pháp Powermock tĩnh mock
Jaison Varghese

17

Theo khái niệm OOP, sẽ là một thiết kế tồi nếu các biến tĩnh được tự động tải.

Biến static không phải là thuộc tính của Object, nhưng nó là thuộc tính của Class. Hệ thống dây tự động của lò xo được thực hiện trên các đối tượng và điều đó làm cho thiết kế trở nên sạch sẽ theo quan điểm của tôi. Bạn có thể triển khai đối tượng bean có dây tự động dưới dạng singleton và đạt được điều tương tự khi xác định nó tĩnh.


15

Bằng giải pháp này, bạn có thể tự động tải trường tĩnh vào mùa xuân.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder sẽ phàn nàn về việc thiết lập trường tĩnh từ phương thức không tĩnh.
Neftanic

@Neftanic thành viên tham khảo tĩnh từ những người không tĩnh công trình, nghịch đảo không
Younes zeboudj
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.