2012-08-30 40 views
13

Tôi đang sử dụng Java dựa trên cấu hình để thiết lập bối cảnh ứng dụng Spring của tôi như thế này:Làm thế nào để tải tất cả đậu lười biếng với @ComponentScan trong mùa xuân?

@Configuration 
@Lazy 
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class}) 
public class MyAppConfig { 
    ... 
} 

Đậu được xác định một cách rõ ràng trong cấu hình được nạp uể oải, giống như bạn mong đợi. Tuy nhiên, các lớp được quét chú thích với @Named luôn được tải háo hức. Làm sao tôi có thể giải quyết việc này?

Mọi trợ giúp đều được đánh giá cao.


Lưu ý rằng cho các lớp trong gói MyProject, tôi có thể làm việc này bằng cách chú thích chúng với @Lazy là tốt. Nhưng dự án khác không có sự phụ thuộc vào mùa xuân và tôi muốn giữ nó như thế (vì thế @Named và không phải là @Component).


Cũng lưu ý rằng điều này không có đường may là vấn đề trong cấu hình dựa trên XML. Ở đó, đặt default-lazy-init="true" trong các đường nối thẻ <beans> để làm những gì tôi muốn (mặc dù tôi chưa thử nghiệm).

+3

Vì vậy, hãy thử thêm nhỏ '<đậu mặc định-lười-init = "true" /> 'tệp XML và để phần còn lại cho Cấu hình Java. Nếu không có cách nào để thực hiện điều này với '@ Configuration', đừng ngần ngại [nêu vấn đề] (https://jira.springsource.org/secure/Dashboard.jspa). –

+0

kiểm tra điều này: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/annotation/Lazy.html – Elbek

+2

Có một báo cáo lỗi mở về điều này: https: // jira.spring.io/browse/SPR-10459 –

Trả lời

12

Tính đến phiên bản 4.1 RC2, lỗi này là cố định, và bạn có thể thực hiện tải lười biếng trên quét thành phần với:

@ComponentScan(basePackages = ["..."], lazyInit = true) 

https://jira.spring.io/browse/SPR-10459

+0

Tuyệt vời. Điều này giúp đơn giản hóa cấu hình junit của tôi. – Basil

2

Như bạn đã nói trước đây không có cách nào trực tiếp để xử lý điều đó (sử dụng @Lazy trong lớp cấu hình). Nhưng bạn có thể thử với phương pháp này:

Tôi cho rằng OtherProject là dự án không sử dụng Spring và tưởng tượng rằng các lớp này không được chú thích.

Sau đó, bạn cần xác định trong myproject một cấu hình trông như thế:

@Configuration 
// Avoid use this line if classes aren't annotated @ComponentScan("com.otherProject") 
public class MyProjectConfig { 

    @Bean(name = "lazyBean") 
    @Lazy 
    public LazyBean lazyBean(){ 
     System.out.println("Loading LazyBean bean"); 
     return new LazyBean(); // Or use a static method factory, this is only an example 
    } 
} 

Sử dụng này, đậu "lazyBean" sẽ được tạo ra khi một số ví dụ tiêm nó hoặc khi bạn explicity gọi nó, nhưng không bao giờ thời gian init. Xin lưu ý rằng bạn cần phải xác định một bean mới cho mỗi lớp mà bạn muốn sử dụng, vì vậy điều này không tốt nếu bạn có nhiều lớp nhưng tốt để giảm thiểu khả năng truy cập của các lớp của dự án khác của bạn (có lẽ không phải tất cả các lớp học là cần thiết).

Tôi hy vọng điều này sẽ hữu ích.

+0

Trên thực tế, các lớp của dự án khác * được chú thích, nhưng với '@ Named'. Vì vậy, tôi muốn tận dụng lợi thế của '@ ComponentScan' và tránh phải định nghĩa tất cả các bean một cách rõ ràng. Nhưng cảm ơn thời gian của bạn, tôi sẽ chấp nhận câu trả lời của bạn. – rolve

Các vấn đề liên quan