- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Khi nhiều người lần đầu tiên tiếp xúc với mùa xuân, họ vô cùng yêu thích @Autowired.
Chỉ với một chú thích, việc chèn phụ thuộc có thể được thực hiện dễ dàng, ngay cả số lượng mã hóa cũng được lưu.
Ai không thích nó?
Nhưng tăng dần, đặc biệt là trong các dự án phức tạp hơn, @Autowired bắt đầu cung cấp cho bạn một số thủ thuật.
Vì vậy, quan chức này đã đưa ra một số tài liệu và trao đổi cộng đồng: Không nên sử dụng @Autowired mà không suy nghĩ, Nhưng việc tiêm tạo ra sự kích thích hơn.
Tại sao? Có phải @Autowired không?
Nó đã hoạt động được, nhưng vấn đề là: nó không phải là bất khả chiến bại và có thể dễ dàng dẫn đến bẫy bẫy if use.
Vui lòng nói về lý do tại sao quan chức, khuyên bạn nên sử dụng @Autowired một cách cẩn thận và cung cấp cho bạn một số ví dụ về mã hóa. Tôi hy vọng nó sẽ hữu ích cho bạn.
Nhiều bạn thích viết trực tiếp tại nơi làm việc:
@Service lớp công khai MyService { @Autowired riêng tư MyRepository myRepository }
Nó có vẻ đơn giản, nhưng vấn đề ở đây là: các phần phụ thuộc của lớp bị ẩn quá sâu.
Dịch vụ của tôi
Và Kho lưu trữ của tôi
Mối quan hệ thực chất là một “sự phụ thuộc vô hình”, phụ thuộc hoàn toàn vào @Autowired
for in.kho lưu trữ của tôi
Nó là gì và nó diễn ra như thế nào có thể dự đoán được thông qua IDE hoặc thời gian chạy.Kết quả của sự phụ thuộc cao cấp là mã nhìn đơn giản nhưng khó bảo trì.
Việc thêm một phần phụ thuộc mới sau đó hoặc thay đổi thứ tự của các phần phụ thuộc có thể tạo ra cho mọi người rối loạn trong vài phút.
Thay vào đó hãy sử dụng nội dung xây dựng.
@Service public class MyService { Private Final MyRepository myRepository; // Nội dung hàm tạo, các phần phụ thuộc rõ ràng trong chớp mắt public MyService(MyRepository myRepository) { this.myRepository = myRepository } }
Lợi ích của công việc này là:
Một ví dụ khác, nhiều người thích sử dụng trực tiếp @Autowired để đưa vào các cơ sở phát triển khai cụ thể, có giới hạn như:
@Service lớp công khai MyService { @Autowired riêng Cụ thểRepositoryRepository }
Nhìn bề ngoài thì không có gì sai, nhưng đây là mối ràng buộc chặt chẽ giữa MyService và SpecialRepository.
Điều gì sẽ xảy ra AnotherSpecificRepository, bạn sẽ phải thay đổi mã và chú thích, đồng thời các bài kiểm tra cũng sẽ giảm.
Sử dụng tính năng chèn giao diện và tạo chức năng để phân tách các phần phụ thuộc.
@Service lớp công khai MyService { kho lưu trữ cuối cùng riêng tư; MyService công khai (kho lưu trữ kho lưu trữ) { this.repository = kho lưu trữ;
Sau đó, công cụ định cấu hình phát triển có thể thông qua cấu hình tệp của Spring hoặc lớp @Configuration:
@Configuration lớp công khai RepositoryConfig { @Bean public Repository kho lưu trữ() { return Cụ thể mới() } }
Ưu điểm của công việc này là:
Một số người bạn thích viết như thế này:
@Service lớp công khai MyService { @Autowired riêng MyRepository myRepository; public void doSomething() { myRepository.save(); // Bang!
Vấn đề là gì? NullPointerException.
Sử dụng hàm tạo để loại bỏ toàn bộ giá trị trống.
@Service lớp công khai MyService { Riêng tư Cuối cùng MyRepository myRepository; public MyService(MyRepository myRepository) { this.myRepository = myRepository; khởi tạo} public void doSomething() { myRepository.save();
Một ưu tiên khác của hàm tạo là việc tiêm thuộc tính bắt buộc. báo lỗi, phát hiện vấn đề sớm.
Cơ chế tự động kết nối của Spring đôi khi là "ma thuật đen", đặc biệt khi có nhiều loại đậu ứng cử viên trong dự án của bạn. Ví dụ:
@Service public class MyService { @Autowired Private Repository kho lưu trữ // Có hai lớp triển khai Kho lưu trữ trong vùng chứa, tôi nên làm gì? }
Nếu có hai lớp triển khai, chẳng hạn như Cụ thể và Kho lưu trữ khác, bộ chứa Spring sẽ báo lỗi trực tiếp. Có hai giải pháp:
@Sơ đẳng
.@Qualifier
Chỉ định thủ công.Nhưng những phương pháp này làm cho mã trông phức tạp hơn và có thể dẫn đến cạm bẫy.
Xây dựng nội dung + cấu hình rõ ràng.
@Configuration lớp công khai RepositoryConfig { @Bean public Repository kho lưu trữ() { return Cụ thể mới() } }
Bạn cho Spring biết rõ nên sử dụng lớp triển khai nào. Đừng để vùng chứa đoán cho bạn, để tránh "thuốc không khớp" trong tương lai.
Cuối cùng, hãy nói về thử nghiệm.
@Autowired dựa vào Spring container để hoạt động, nhưng khi viết unit test thì không ai nghĩ đến Spring container (rắc rối và chậm). Kết quả là:
Nội dung xây dựng vốn được thiết kế để thử nghiệm đơn vị.
lớp công khai MyServiceTest { @Test public void testDoSomething() { MyRepository mockRepository = mock(MyRepository.class); MyService myService = new MyService(mockRepository); // Kiểm tra logic} }
Bạn có thấy nó không?
Đưa trực tiếp đối tượng mô phỏng vào, bài kiểm tra rất đơn giản và tinh tế.
Tóm tắt ngắn gọn vấn đề:
Vậy chúng ta nên làm gì? Sử dụng nội dung xây dựng, rõ ràng, mạnh mẽ và thân thiện với thử nghiệm. Khuyến nghị chính thức không phải là không có lý.
Nhưng nói như vậy, không phải là @Autowired không dùng được mà chỉ là bạn ghi điểm cho cảnh đó thôi.
Trong quá trình phát triển, hãy phát triển thói quen sử dụng nội dung hàm tạo để làm cho mã của bạn mạnh mẽ hơn, đào ít lỗ hơn và thực hiện nhiều công việc hơn! .
Nếu bài viết này hữu ích hoặc truyền cảm hứng cho bạn, hãy giúp tôi theo dõi tài khoản công khai cùng tên của tôi: Su San nói về công nghệ. Sự ủng hộ của bạn là động lực lớn nhất để tôi tiếp tục viết. Vui lòng nhấp vào ba liên kết: thích, chuyển tiếp và xem. Theo dõi tài khoản công khai: [Su San nói về công nghệ] và trả lời trong tài khoản công khai: Nếu bạn vào một nhà máy lớn, bạn có thể nhận được hướng dẫn phỏng vấn miễn phí 100.000 từ mà tôi mới biên soạn. Nhiều bạn đã nhận được lời mời từ nhiều nhà máy lớn. các công ty bằng cách dựa vào hướng dẫn này.
Cuối cùng, bài viết này giải thích tại sao Spring chính thức không khuyến nghị sử dụng @Autowired? Bài viết này kết thúc như vậy nếu bạn muốn biết thêm về lý do tại sao Spring chính thức không khuyến nghị sử dụng @Autowired? Về nội dung, vui lòng tìm kiếm các bài viết của 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 tìm trên mạng nhưng không tìm thấy bài viết phù hợp giải thích cách sử dụng dịch vụ WCF bằng javascript, đặc biệt là WebScriptEndpoint. Bất cứ ai có thể đưa ra bất kỳ hướng dẫn về điều này? Cảm ơn bạn vì câu trả lời tốt nhất Đây là một bài viết về.
Tôi đang viết một chương trình C sẽ chạy các lệnh Linux, ví dụ: cat /etc/passwd | grep list cut -c 1-5 Tôi không nhận được kết quả nào *ở đây cha mẹ đợi con đầu lòng (chi
Vì vậy, tôi đang cố gắng xử lý việc tải tệp lên và sau đó lưu trữ tệp đó vào cơ sở dữ liệu dưới dạng tệp nhị phân. Sau khi lưu trữ, tôi cố gắng phân phát tệp trên URL đã cho. Tôi dường như không thể tìm thấy một phương pháp hoạt động ở đây. Tôi cần sử dụng cơ sở dữ liệu vì tôi sử dụng Google Apps
Tôi đang cố gắng tạo một macro thêm công thức bên dưới vào một ô rồi kéo nó qua cột và sao chép cùng một công thức trong cột H. Tôi muốn nhập dữ liệu vào cột F và H bằng công thức Range("F1") .công thức = "=IF(ISE
Câu hỏi tương tự như câu hỏi này, nhưng tôi muốn sử dụng OperatorPrecedenceParser để phân tích một biểu thức bằng ứng dụng hàm trong FParsec. Đây là AST của tôi: type Expression =.
Tôi muốn thay đổi truy vấn này thành mã tùy thuộc vào vị trí chọn COUNT(giới tính) làm số lượng giới tính từ khách hàng bằng cách sử dụng phần tiếp theo và node.js
Tôi đang sử dụng GNU bash, phiên bản 5.0.3(1)-distro (x86_64-pc-linux-gnu) và tôi đang tự hỏi tại sao tôi lại gặp lỗi cú pháp với một câu lệnh gán đơn giản: #/bin/bash var1= /tmp
Đây là lý do tại sao mã của tôi không hoạt động trong IE. Mã của tôi hoạt động trong tất cả các trình duyệt. Không có gì. Nhưng khi tôi chạy dự án của mình trên IE thì nó phát hiện lỗi. Và cả lớp jquery của tôi cũng như lớp InsertadjacentHTMl đều không
Tôi đang cố gắng thay đổi HTML bên trong thẻ. duy nhất mà thẻ có thuộc tính "for". Đây là cấu trúc của đầu vào và nhãn:
Tôi có một trang nơi tôi trả lời bài đăng của người dùng, tôi có thể đưa ra nhận xét ngay lập tức về những bài viết đó đăng này bằng cách sử dụng một số jquery mã hóa, sau khi nhận được nhận xét mới được đăng, tôi chèn nhận xét mới bên dưới bài viết Đăng cùng với nút xóa.
Tôi có tệp "được phân tích bằng đường ống" với khoảng 20 cột. sha1sum, một số giống như số tài khoản và trả về phần còn lại của các cột. Cách tốt nhất để thực hiện điều này. bằng awk hoặc sed là tài khoản gì?
Tôi cần chèn nội dung sau vào bảng của mình... mục nhập. lỗi này: #1054 - U
Vì vậy, tôi đang cố gắng có một trường nhập để tôi có thể nhập bất kỳ ký tự nào, nhưng sau đó viết giá thường xuyên đã nhập giá trị, xóa mọi ký tự không phải chữ và số, để lại "." Ví dụ mình nhập: 70% left land is nước, -!*#$^ & 30% đất bị mất
Tôi đang cố gắng làm một công việc mà tôi nghĩ là rất đơn giản nhưng vì lý do nào mà tôi lại không đạt được kết quả như mong muốn? xác thực.
Tôi muốn tải dữ liệu từ cơ sở dữ liệu mysql bằng Angularjs. Tôi muốn góc cạnh
Tôi đang sử dụng autoLayout và tôi muốn đặt nhãn UIlabel trên UITableViewCell, nhãn này phải luôn ở bên phải và chính giữa bên phải của ô.
Tôi cần truy vấn tương thích với elaticsearch với MySql. Truy vấn sql của tôi: CHỌN DISTINCT t.product_id NHƯ id Tbl_sup_price t
Tôi đang phát triển mã hóa để sử dụng JSON. thiết lập func() { if let FlickrURL = NSURL(string: "https://api.flickr.com/
Tuy tự nhiên, tôi gặp sự cố khi thực hiện thao tác trong javascript. Bây giờ, khi so sánh col.1 và
HTML: 1 2 3 CSS: .BB a:hover{ color: #000 } .BB > li:after {
Tôi là một lập trình viên xuất sắc, rất xuất sắc!