私はスプリングが初めてです。春のコンテキストには存在しない通常の Java Bean で autowired を使用するための代替手段はありますか。
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の完全な機能を使用して、すべてのコンストラクターにカスタム アスペクトを提供し、依存性注入を自分で処理することです。