CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này giải quyết vấn đề @Autowired injecting static interfaces. Bài đăng được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Mục lục
- Vấn đề giao diện tĩnh tiêm @Autowired
- @Autowired rất tiện lợi cho việc tự động đưa các dịch vụ chung vào
- Tuy nhiên, nếu bạn tiêm một dịch vụ tĩnh đã sửa đổi, nó không thể được tiêm
- Sau đó, tôi tìm kiếm trên Baidu và tìm thấy một phương pháp
- Thẻ giải thích
- Các vấn đề gây ra lỗi tiêm @Autowired
Vấn đề giao diện tĩnh tiêm @Autowired
@Autowired rất tiện lợi cho việc tự động đưa các dịch vụ chung vào
giống:
?
1
2
3
4
5
6
7
8
|
@Thành phần
công cộng
lớp học
Cảnh báoMatterUtil {
@Autowired
riêng tư
IDScypWarningMatterService cảnh báoMatterService;
công cộng
vô hiệu
dScypWarningMatterFZ(){
}
}
|
Tuy nhiên, nếu bạn tiêm một dịch vụ tĩnh đã sửa đổi, nó không thể được tiêm
giống:
?
1
2
3
4
5
6
7
8
|
@Thành phần
công cộng
lớp học
Cảnh báoMatterUtil {
@Autowired
riêng tư
tĩnh
IDScypWarningMatterService cảnh báoMatterService;
công cộng
tĩnh
vô hiệu
dScypWarningMatterFZ(){
}
}
|
Sau đó, tôi tìm kiếm trên Baidu và tìm thấy một phương pháp
Mã đã sửa đổi như sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Thành phần
công cộng
lớp học
Cảnh báoMatterUtil {
@Autowired
riêng tư
IDScypWarningMatterService cảnh báoMatterService;
riêng tư
tĩnh
Cảnh báoMatterUtil cảnh báoMatterUtil;
@PostXây dựng
công cộng
vô hiệu
khởi tạo() {
cảnh báoMatterUtil =
cái này
;
cảnh báoMatterUtil.warningMatterService =
cái này
.warningMatterService;
}
/**
* Phương pháp giao bài
*
*/
công cộng
tĩnh
vô hiệu
dScypWarningMatterFZ(){
}
}
|
Thẻ giải thích
-
@Autowired
: Tác động lên các trình xây dựng, thuộc tính và phương thức. Được tự động đưa vào bởi byType. (@Resource được tự động đưa vào bởi byName theo mặc định)
-
@PostXây dựng
:Phương thức được sửa đổi bởi @PostConstruct sẽ chạy khi máy chủ tải Servle và chỉ được máy chủ thực thi một lần. PostConstruct được thực thi sau hàm tạo và trước phương thức init(). (Phương thức PreDestroy() được thực thi sau khi phương thức destroy() được thực thi)
Các vấn đề gây ra lỗi tiêm @Autowired
lý lịch
Trong quá trình thử nghiệm, tôi phát hiện @Autowired không thể inject được. Khi sử dụng dịch vụ, tôi phát hiện ra nó là null! .
lý do
Sau đây là một số lý do tại sao @Autowired không thể được đưa vào:
?
1
2
|
@Autowired
riêng tư
tĩnh
Dịch vụ kiểm tra Dịch vụ kiểm tra;
|
Được sửa đổi bởi static, Spring dependency injection dựa vào các phương thức set, và các phương thức set là các phương thức đối tượng thông thường. Các biến static là các thuộc tính của lớp, do đó hoạt động injection không thể hoàn tất.
@Autowired tự động inject theo loại. Tóm lại, private TestService testService được khớp và inject theo loại TestService. Tên có thể không nhất quán. Nếu không khớp loại tương ứng, inject sẽ không thành công.
Nói chung, nó không được quản lý bởi container ioc và loại không thể khớp trong container. Chú thích (@Service, @repository, @Component, v.v.) bắt buộc phải được đưa vào container spring IOC.
Còn một tình huống nữa là khi tất cả các chú thích đều bình thường thì có thể là do quy tắc mặc định của Bean assembly của dự án SpringBoot là quét từ trên xuống dưới theo vị trí gói của lớp Application! "Lớp ứng dụng" đề cập đến lớp mục nhập dự án SpringBoot.
Vị trí của lớp học này rất quan trọng:
Nếu gói mà lớp Application nằm ở: com.boot.app, chỉ gói com.boot.app và tất cả các gói con của nó sẽ được quét. Nếu gói mà dịch vụ hoặc dao nằm không nằm trong com.boot.app và các gói con của nó, nó sẽ không được quét! Tức là đặt lớp Application lên trên package nơi dao và service nằm. com.boot.Application biết điểm rất quan trọng này. Vị trí khác nhau và không thể quét được các chú thích bên dưới vị trí tương ứng.
Trên đây là kinh nghiệm cá nhân của tôi, hy vọng có thể giúp bạn tham khảo và mong bạn có thể ủng hộ tôi.
Liên kết gốc: https://blog.csdn.net/happy_Pinocchio/article/details/50857917.
Cuối cùng, bài viết này về giải quyết vấn đề @Autowired injecting static interface đã có ở đây. Nếu bạn muốn biết thêm về cách giải quyết vấn đề @Autowired injecting static interface, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!