Spring @Autowiredの使用法を理解する スプリング配線の他のオプションである@Configuration
クラスの完全な知識ベースを作成したかったのです。
次のようなSpring XMLファイルがあるとします。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="another-application-context.xml"/>
<bean id="someBean" class="stack.overflow.spring.configuration.SomeClassImpl">
<constructor-arg value="${some.interesting.property}" />
</bean>
<bean id="anotherBean" class="stack.overflow.spring.configuration.AnotherClassImpl">
<constructor-arg ref="someBean"/>
<constructor-arg ref="beanFromSomewhereElse"/>
</bean>
</beans>
代わりに@Configuration
を使用するにはどうすればよいですか?コード自体に影響はありますか?
@Configuration
に移行していますいくつかの手順でxmlを@Configuration
に移行することができます。
@Configuration
注釈付きクラスを作成します。
@Configuration
public class MyApplicationContext {
}
<bean>
タグごとに、@Bean
アノテーションが付けられたメソッドを作成します。
@Configuration
public class MyApplicationContext {
@Bean(name = "someBean")
public SomeClass getSomeClass() {
return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
}
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass() {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
}
}
beanFromSomewhereElse
をインポートするには、その定義をインポートする必要があります。 XMLで定義でき、@ImportResource
を使用します。
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Beanが別の@Configuration
クラスで定義されている場合、@Import
アノテーションを使用できます。
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
他のXMLまたは@Configuration
クラスをインポートした後、次のように@Configuration
クラスのプライベートメンバーを宣言することで、コンテキストで宣言するBeanを使用できます。
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
または、次のように@Qualifier
を使用して、このbeanFromSomewhereElse
に依存するBeanを定義するメソッドのパラメーターとして直接使用します。
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
プロパティのインポートは、別のxmlまたは@Configuration
クラスからBeanをインポートすることに非常に似ています。 @Qualifier
を使用する代わりに、次のようなプロパティで@Value
を使用します。
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
これはSpEL式でも使用できます。
SpringがそのようなクラスをBeanコンテナとして処理できるようにするには、このタグをコンテキストに追加して、メインxmlでこれをマークする必要があります。
<context:annotation-config/>
単純なBeanを作成する場合とまったく同じ@Configuration
クラスをインポートできるようになりました。
<bean class="some.package.MyApplicationContext"/>
Spring XMLを完全に回避する方法はありますが、この答えの範囲には含まれていません。これらのオプションの1つは、私の答えをベースにしている ブログ投稿 で見つけることができます。
基本的に、いくつかの利点があるため、XMLを使用するよりもBeanを宣言するこの方法の方がはるかに快適です。
@Configuration
クラスはコンパイルされ、タイプミスはコンパイルを許可しません欠点は、私が見ているように多くはありませんが、私が考えることができるいくつかがあります:
@Configuration
クラスを使用する場合、コンパイル時にクラスを使用可能にする必要があります。通常、それは問題ではありませんが、場合によっては問題になる可能性があります。結論:XML、@Configuration
、および annotations をアプリケーションコンテキストで組み合わせるのはまったく問題ありません。 Springは、Beanが宣言されたメソッドを気にしません。