クラスがあるとしましょう:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
次に、このクラスのオブジェクトを作成しました(または他のフレームワークがこのクラスのインスタンスを作成しました)。
MyClass obj = new MyClass();
依存関係をまだ注入することは可能ですか?何かのようなもの:
applicationContext.injectDependencies(obj);
(Google Guiceにはこのようなものがあると思います)
これを行うには、AutowireCapableBeanFactory
のautowireBean()
メソッドを使用します。任意のオブジェクトを渡すと、Springはそれを自分自身で作成したもののように扱い、さまざまな自動配線を適用します。
AutowireCapableBeanFactory
を取得するには、次のように自動配線します。
private @Autowired AutowireCapableBeanFactory beanFactory;
public void doStuff() {
MyBean obj = new MyBean();
beanFactory.autowireBean(obj);
// obj will now have its dependencies autowired.
}
MyConfigに@Configurableアノテーションを付けることもできます。
@Configurable
public class MyClass {
@Autowired private AnotherClass instance
}
その後、作成時に自動的に依存関係が挿入されます。また、<context:spring-configured/>
アプリケーションコンテキストxml。
同じニーズがあり、私の場合は、Springで管理できないJavaクラス内のロジックで、ApplicationContext
にアクセスできました。scaffmanに触発されました。
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
@ glaz666で言及されているbriefly
として_@Configurable
_アプローチに従うソリューションを共有したかった answer
Spring Neo4j & Aop starts
_を含むSpring Boot 2.0.3(とにかく無関係です)Spring Boot
_を使用して_@Configurable
_の準備ができたら、Beanをインスタンス化します(ApplicationRunner
を使用)動作させるには、以下の手順に従う必要がありました
Bean
の上に配置される@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
。私の場合、手動でインスタンス化されるBean
には_@Autowired
_サービスがあるため、上記のアノテーションの小道具です。XXXApplicaiton.Java
_および@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
を使用して、Spring Bootのメイン_@SpringBootApplication
_(または_@EnableSpringConfigured
_で注釈付けされたファイル)に注釈を付けますcompile('org.springframework.boot:spring-boot-starter-aop')
およびcompile('org.springframework:spring-aspects:5.0.7.RELEASE')
@Configurable
_アノテーションが付けられたBean
を新規追加し、依存関係を自動接続する必要があります。*上記のポイント#3に関して、_org.springframework.boot:spring-boot-starter-aop
_が_spring-aop
_を推移的にプルすることを認識しています(ここに示すように mavencentral )が、私の場合、Eclipseは解決できませんでした_@EnableSpringConfigured
_注釈、したがって、なぜスターターに加えて_spring-aop
_依存関係を明示的に追加したのか。同じ問題に直面した場合は、依存関係を宣言するか、解明する冒険に出かけましょう
org.springframework.context.annotation.aspect.*
_が利用できない理由