Trong dự án của tôi, tôi đang cố gắng để di chuyển tất cả tập quán củamùa xuân dây theo loại là chậm hơn bởi độ lớn hơn dây theo tên
Foo foo = (Foo) beanFactory.getBean("name");
vào
Foo foo = beanFactory.getBean(Foo.class);
Những lợi ích là hiển nhiên: loại an toàn, mã ít phức tạp hơn, hằng số ít vô ích hơn, v.v. Thông thường các dòng như vậy được đặt trong các ngữ cảnh kế thừa tĩnh, nơi mà một hệ thống dây điện là lựa chọn duy nhất.
Điều này là tốt cho đến một ngày người dùng bắt đầu phàn nàn về sự chậm chạp mà hóa ra đến từ nội bộ mùa xuân. Vì vậy, tôi bị sa thải lập một hồ sơ để tìm một hotspot trong
org.springframework.beans.factory.support.AbstractBeanFactory::doGetBean(String, Class<T>, Object[], boolean)
trong đó có một cuộc gọi tốn kém để
Class.isAssignableFrom(anotherClass)
.
tôi đã nhanh chóng tạo ra một bài kiểm tra hiệu suất nhỏ để tìm hiểu sự khác biệt tốc độ giữa tên chuỗi và loại tra cứu là một gà lần (Tôi đang sử dụng StaticApplicationContext
cho FAIW kiểm tra này)!
Trong khi điều tra điều này, tôi đã tìm thấy SPR-6870 có số phiếu bầu cao nhưng vì một số lý do không được giải quyết. Điều này đã dẫn tôi đến an attempt to solve this problem cải thiện đáng kể tình hình nhưng vẫn chậm hơn ~ 25 lần tra cứu bằng chuỗi! Nó chỉ ra nỗ lực này chỉ giải quyết được một nửa vấn đề: nó lưu trữ tên của bean để lưu vào lần lặp O (n) nhưng vẫn phải gọi isAssignableFrom
để xác thực loại.
Vấn đề được mô tả không chỉ liên quan đến kịch bản của tôi mà còn cho đậu sử dụng @Autowired
và có thể cảm thấy khó khăn trong trường hợp hạt được tạo bên trong vòng lặp.
Một trong các giải pháp sẽ là ghi đè lên một trong các phương pháp nhà máy đậu và lưu trữ kết quả kiểm tra kiểu này, nhưng rõ ràng điều này nên được thực hiện trong Spring chứ không phải trong mã của riêng tôi.
Có ai khác đang gặp phải sự cố tương tự và tìm thấy giải pháp cho nó không?
Vì vậy, bạn muốn tự động theo loại, nhưng không thực hiện bất kỳ kiểm tra loại nào? – GreyBeardedGeek
Tôi muốn cuộc gọi thứ hai chống lại cùng loại để tránh việc kiểm tra loại đắt tiền. Hoặc ít nhất tôi muốn một khả năng để xác định cho dù điều này được kích hoạt hoặc vô hiệu hóa. Tạo đối tượng là một điều cơ bản mà các tối ưu hóa nhỏ như thế này có thể tạo ra sự khác biệt lớn. – mindas