2012-02-24 8 views
23

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?

+0

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

+0

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

Trả lời

2

Hầu hết các ứng dụng Spring kết nối mọi thứ với nhau khi khởi động, thay vì lấy hạt từ ngữ cảnh khi chạy. Thậm chí, trừ khi bạn đang thay đổi bối cảnh ứng dụng của bạn rất nhiều trong quá trình chạy thường xuyên ứng dụng của bạn, bạn sẽ không bao giờ tìm nạp một bean nhiều hơn một lần.

Cho rằng, nếu người dùng của bạn phàn nàn về sự chậm chạp, có vẻ như vấn đề thực sự của bạn là quá nhiều tra cứu bean; việc bạn sử dụng một phương tiện chậm hơn để làm như vậy vừa mới xuất hiện vấn đề thực sự.

Tôi sẽ thử chuyển sang Java Config (định cấu hình các phụ thuộc của bạn trong Java, được hỗ trợ trong Spring 3.0 tôi tin) và định cấu hình ứng dụng của bạn để kết nối tất cả các hạt khi khởi động. Điều này cũng có lợi thế là ứng dụng của bạn sẽ không khởi động nếu không thể đáp ứng các phụ thuộc.

+0

Tôi nghĩ những gì bạn muốn thực sự nói là "vấn đề của tôi là tôi đang sử dụng Spring cho điều này" :) Về Java Config - vâng, đây là một tùy chọn thoát, nhưng tôi vẫn nghĩ rằng vấn đề ban đầu cần được giải quyết ảnh hưởng (đánh giá từ số lượng upvote) rất nhiều người dùng Spring khác. – mindas

+0

Tôi chưa bao giờ gặp vấn đề này với Spring và sử dụng nó trên một số dự án khá lớn. Thời gian khởi động ứng dụng khá chậm, nhưng một khi mọi thứ đã được kết nối, nó hoạt động tốt. Chúng tôi thường tự động theo tên, nhưng cũng có một số cấu hình XML. Chúng tôi không bao giờ gọi trực tiếp đến GetBean. – davetron5000

+0

"Các dự án lớn" có thể có các tình huống khác nhau. Lập luận của bạn rằng bạn không bao giờ có vấn đề này là tranh luận. Hơn nữa, tôi nghi ngờ rằng gợi ý rằng việc sử dụng Java Config (thay vì XML, chẳng hạn) sẽ giúp ích theo bất kỳ cách nào - nếu cùng một kiểu BeanFactory được sử dụng, nó sẽ phải chịu cùng một vấn đề. Đó là việc thực hiện khởi tạo bean nhà máy bị hỏng và không phải là hội đồng. – mindas

5

Sự cố này hiện được giải quyết vào mùa xuân với độ phân giải SPR-6870. Xem ý kiến ​​giải quyết ở đó để biết chi tiết. Bản sửa lỗi có sẵn như phiên bản 3.2.0.RELEASE và 3.1.2.

+1

Chúng tôi đang sử dụng mùa xuân 3.2.1 nhưng hầu hết thời gian dành cho ứng dụng trong khi khởi động là tự động theo loại. Bất kỳ đề xuất? –