16

Java ベースの構成を使用して、Spring アプリケーションのコンテキストを次のように設定しています。

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

構成で明示的に定義された Bean は、予想どおり遅延ロードされます。ただし、 で注釈@Namedが付けられたスキャンされたクラスは、常に熱心にロードされます。どうすればこれを解決できますか?

どんな助けでも大歓迎です。


パッケージ内のクラスについては、MyProject注釈を付けることでこれを回避できることに注意してください@Lazy。しかし、他のプロジェクトはSpringに依存していないので、そのように保ちたいです(したがって@Named、そうではありません@Component)。


これは、XML ベースの構成では問題にならないことにも注意してください。そこで、タグの継ぎ目を設定default-lazy-init="true"して、必要なことを行います(ただし、テストしていません)。<beans>

4

3 に答える 3

21

バージョン 4.1 RC2 の時点で、このバグは修正されており、次のようにしてコンポーネント スキャンで遅延読み込みを実行できます。

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

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

于 2015-04-23T19:39:17.897 に答える
2

前に言ったように、それを処理する直接的な方法はありません (構成クラスで @Lazy を使用)。ただし、次のアプローチを試すことができます。

OtherProject は Spring を使用していないプロジェクトであり、これらのクラスにはアノテーションが付けられていないとします。

次に、Myproject で次のような構成を定義する必要があります。

@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
    }
}

これを使用すると、インスタンスが注入したとき、または明示的に呼び出したときに、Bean「lazyBean」が作成されますが、初期化時には作成されません。

使用するクラスごとに新しい Bean を定義する必要があることに注意してください。これは、大量のクラスがある場合には適していませんが、他のプロジェクトのクラスのアクセシビリティを最小限に抑えるには適しています (おそらく、すべてのクラスが必要なわけではありません)。 .

これが役立つことを願っています。

于 2012-09-27T16:41:19.467 に答える