web-dev-qa-db-ja.com

Springで自己インスタンス化されたオブジェクトに依存関係を注入する方法は?

クラスがあるとしましょう:

public class MyClass {
    @Autowired private AnotherBean anotherBean;
}

次に、このクラスのオブジェクトを作成しました(または他のフレームワークがこのクラスのインスタンスを作成しました)。

MyClass obj = new MyClass();

依存関係をまだ注​​入することは可能ですか?何かのようなもの:

applicationContext.injectDependencies(obj);

(Google Guiceにはこのようなものがあると思います)

117
Igor Mukhin

これを行うには、AutowireCapableBeanFactoryautowireBean()メソッドを使用します。任意のオブジェクトを渡すと、Springはそれを自分自身で作成したもののように扱い、さまざまな自動配線を適用します。

AutowireCapableBeanFactoryを取得するには、次のように自動配線します。

private @Autowired AutowireCapableBeanFactory beanFactory;

public void doStuff() {
   MyBean obj = new MyBean();
   beanFactory.autowireBean(obj);
   // obj will now have its dependencies autowired.
}
174
skaffman

MyConfigに@Configurableアノテーションを付けることもできます。

@Configurable
public class MyClass {
   @Autowired private AnotherClass instance
}

その後、作成時に自動的に依存関係が挿入されます。また、<context:spring-configured/>アプリケーションコンテキストxml。

18
glaz666

同じニーズがあり、私の場合は、Springで管理できないJavaクラス内のロジックで、ApplicationContextにアクセスできました。scaffmanに触発されました。

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
3
rand0m86

@ glaz666で言及されているbrieflyとして_@Configurable_アプローチに従うソリューションを共有したかった answer

  • @ -skaffmanによる answer はほぼ10年前であり、十分ではない、または機能しないという意味ではありません
  • @ glaz666による答えは簡潔で、私の問題を解決するのに実際には役立ちませんでしたが、正しい方向に向けてくれました

私のセットアップ

  1. _Spring Neo4j & Aop starts_を含むSpring Boot 2.0.3(とにかく無関係です)
  2. _Spring Boot_を使用して_@Configurable_の準備ができたら、Beanをインスタンス化します(ApplicationRunnerを使用)
  3. Gradle&Eclipse

手順

動作させるには、以下の手順に従う必要がありました

  1. 手動でインスタンス化されるBeanの上に配置される@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)。私の場合、手動でインスタンス化されるBeanには_@Autowired_サービスがあるため、上記のアノテーションの小道具です。
  2. _XXXApplicaiton.Java_および@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)を使用して、Spring Bootのメイン_@SpringBootApplication_(または_@EnableSpringConfigured_で注釈付けされたファイル)に注釈を付けます
  3. ビルドファイルに依存関係を追加します(使用するビルドに応じてbuild.gradleまたはpom.xml)compile('org.springframework.boot:spring-boot-starter-aop')およびcompile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. どこでも_@Configurable_アノテーションが付けられたBeanを新規追加し、依存関係を自動接続する必要があります。

*上記のポイント#3に関して、_org.springframework.boot:spring-boot-starter-aop_が_spring-aop_を推移的にプルすることを認識しています(ここに示すように mavencentral )が、私の場合、Eclipseは解決できませんでした_@EnableSpringConfigured_注釈、したがって、なぜスターターに加えて_spring-aop_依存関係を明示的に追加したのか。同じ問題に直面した場合は、依存関係を宣言するか、解明する冒険に出かけましょう

  • バージョンの競合はありますか
  • _org.springframework.context.annotation.aspect.*_が利用できない理由
  • IDEが正しく設定されていますか
  • などなど.
2
Raf