2012-03-14 17 views
9

私はSpringアノテーションを使用しています。私は遅延初期化を使用したいと思います。Spring @Autowired @Lazy

別のクラスからBeanをインポートしたいときに、私は@Autowiredを使用しなければならないという問題に遭遇しています。これは遅延初期化を使用していないようです。この怠惰なinitの動作を強制する余地はありますか?

この例では、lazyParentに依存しないchildBeanしかロードしていないので、「ロード先の親Bean」は表示されません。

@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); 

    } 

} 

答えて

11

あなたが@Autowired Long lazyParentを使用しているので、コンテキストの起動時に、春はその依存関係を解決します。 lazyBean@Lazyであるという事実は無関係です。

私はあなたがそれを望むように100%がこのウィルlworkの値を確信していないものの、代替としてこれを試してみてください:

@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() + "!"; 
    } 
} 

P.S. ではなく、実際にという文字列、Doubles、LongsをBeanとして定義していないことを願います。これは単なる例です。右...?

+3

私はちょうど 'Void'のこの恐ろしいビジョンを持っていました。 TDWTFのための1つ私は考えます... –

+6

ボイドビーンそれらをすべて支配する。 ボイドビーンを見つけてください。 ボイドビーンをすべて持って来て、 と依存性注入にバインドしてください。 –

+0

@skaffmanなぜ私は豆としてストリングを定義してはいけないのですか? – wings

関連する問題