0

私はスプリングが初めてです。春のコンテキストには存在しない通常の Java Bean で autowired を使用するための代替手段はありますか。

4

1 に答える 1

1

Spring @ConfigurableをいくつかのAspectJ魔法で使用することで、これを行うことができます。

詳細な説明が必要な場合は、こちらのリンクを参照してください。

そして、これを達成する方法の簡単な概要を次に示します。

まず、どこかに注入したい Bean があります。

@Component
public class InjectedClass {
    // ...
}

次に、インスタンス化する必要がある、Spring コンテナーで管理されていないクラスがあります。このクラスでオートワイヤリングが機能するようにします。@Configurableとしてマークします。

@Configurable
public class NonContainerManagedClass  {

    @Autowired
    private InjectedClass injected;

    // ...
}

次に、この非コンテナー管理の自動配線を機能させたいことを Spring に伝える必要があります。したがって、春の構成に以下を入れます。

<context:load-time-weaver />
<context:spring-configured />

さて、この種のものには@Configurableクラスのバイトコードの変更が必要です。したがって、Tomcat に別の を使用するように指示しますclassloader。これを行うcontext.xmlには、アプリケーションのMETA-INFディレクトリに を作成し、そこに以下を配置します。

<Context path="/youWebAppName">
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
        useSystemClassLoaderAsParent="false"/>
</Context>

ここで、Tomcat はそれを見つける必要がありますclassloader。Spring のspring-tomcat-weaver.jar(おそらく という名前のorg.springframework.instrument.tomcat-<version>.jar) を Tomcat のインストールlibディレクトリに配置することで、aspectj マジックが機能し始めます。@Configurableアノテーションが付けられたクラスの場合、@Autowired依存関係は自動的に解決されます。インスタンスが spring-container の外で作成された場合でも。

これはおそらく、Spring でクリーンな方法で機能させる唯一の方法です。に適切な依存関係があることを確認してくださいclasspath

もう 1 つの方法は、AspectJの完全な機能を使用して、すべてのコンストラクターにカスタム アスペクトを提供し、依存性注入を自分で処理することです。

于 2013-05-30T08:37:42.140 に答える