2012-03-14 9 views
9

Tôi đang sử dụng chú thích Spring và tôi muốn sử dụng khởi tạo lười biếng.Spring @Autowired @Lazy

Tôi đang gặp sự cố khi tôi muốn nhập một bean từ một lớp khác, tôi buộc phải sử dụng @Autowired mà dường như không sử dụng lệnh init lười biếng. Có anyway để buộc hành vi init lười biếng này?

Trong ví dụ này tôi không muốn thấy "Đang tải bean mẹ" chưa từng được in vì tôi chỉ tải childBean không phụ thuộc vào lazyParent.

@Configuration 
public class ConfigParent { 
    @Bean 
    @Lazy 
    public Long lazyParent(){ 
     System.out.println("Loading parent bean"); 
     return 123L; 
    } 

} 

@Configuration 
@Import(ConfigParent.class) 
public class ConfigChild { 
    private @Autowired Long lazyParent; 
    @Bean 
    public Double childBean() { 
     System.out.println("loading child bean"); 
     return 1.0; 
    } 
    @Bean 
    @Lazy 
    public String lazyBean() { 
     return lazyParent+"!"; 
    } 
} 

public class ConfigTester { 
    public static void main(String[] args) { 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigChild.class); 
     Double childBean=ctx.getBean(Double.class); 
     System.out.println(childBean); 

    } 

} 

Trả lời

11

Bởi vì bạn đang sử dụng @Autowired Long lazyParent, Spring sẽ giải quyết phụ thuộc mà khi bối cảnh khởi động. Thực tế là lazyBean@Lazy không liên quan.

Hãy thử điều này như một sự thay thế, mặc dù tôi không phải 100% thuyết phục wil lwork này như bạn muốn nó:

@Configuration 
@Import(ConfigParent.class) 
public class ConfigChild { 

    private @Autowired ConfigParent configParent; 

    @Bean 
    public Double childBean() { 
     System.out.println("loading child bean"); 
     return 1.0; 
    } 

    @Bean 
    @Lazy 
    public String lazyBean() { 
     return configParent.lazyParent() + "!"; 
    } 
} 

T.B. Tôi hy vọng bạn không phải là thực sự xác định Strings, Doubles và Longs là bean và đây chỉ là một ví dụ. Đúng...?

+3

Tôi vừa có tầm nhìn khủng khiếp về một chiếc đậu 'Void'. Một cho TDWTF tôi nghĩ rằng ... –

+6

Void Bean để cai trị tất cả. Void Bean để tìm chúng. Void Bean để mang lại tất cả, và trong Dependency Injection Bind chúng –

+0

@skaffman Tôi có thể hỏi tại sao tôi không nên định nghĩa Strings là bean? – wings