@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @Component public @interface Configuration
@Bean メソッドを宣言し、Spring コンテナーによって処理されて、実行時にこれらの Bean の Bean 定義とサービスリクエストを生成できることを示します。
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
}
}@Configuration クラスのブートストラップ AnnotationConfigApplicationContext 経由 @Configuration クラスは通常、AnnotationConfigApplicationContext またはその Web 対応バリアント AnnotationConfigWebApplicationContext を使用してブートストラップされます。前者の簡単な例を次に示します。AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); MyBean myBean = ctx.getBean(MyBean.class); // use myBean ...詳細については
AnnotationConfigApplicationContext Javadoc を、web.xml 構成手順については AnnotationConfigWebApplicationContext を参照してください。<beans> XML 経由 AnnotationConfigApplicationContext に対して @Configuration クラスを直接登録する代わりに、@Configuration クラスを Spring XML ファイル内の通常の <bean> 定義として宣言できます。
<beans>
<context:annotation-config/>
<bean class="com.acme.AppConfig"/>
</beans> 上記の例では、@Configuration クラスの処理を容易にする ConfigurationClassPostProcessor およびその他のアノテーション関連のポストプロセッサーを有効にするために、<context:annotation-config/> が必要です。@Configuration は @Component でメタアノテーションが付けられているため、@Configuration クラスはコンポーネントスキャン (通常は Spring XML の <context:component-scan/> 要素を使用) の候補であり、通常の @Component と同様に @Autowired/@InjectEE を利用することもできます。特に、単一のコンストラクターが存在する場合、オートワイヤーセマンティクスは透過的に適用されます。
@Configuration
public class AppConfig {
private final SomeBean someBean;
public AppConfig(SomeBean someBean) {
this.someBean = someBean;
}
// @Bean definition using "SomeBean"
}@Configuration クラスは、コンポーネントスキャンを使用してブートストラップされるだけでなく、@ComponentScan アノテーションを使用してコンポーネントスキャンを構成することもできます。
@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
// various @Bean definitions ...
} 詳細については、@ComponentScan javadoc を参照してください。Environment API の使用Environment を通常の @Configuration クラスに挿入することで検索できます(例: @Autowired アノテーションを使用):
@Configuration
public class AppConfig {
@Autowired Environment env;
@Bean
public MyBean myBean() {
MyBean myBean = new MyBean();
myBean.setName(env.getProperty("bean.name"));
return myBean;
}
}Environment を介して解決されるプロパティは、1 つ以上の「プロパティソース」オブジェクトに存在し、@Configuration クラスは、@PropertySources アノテーションを使用して Environment オブジェクトにプロパティソースを提供できます。
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Inject Environment env;
@Bean
public MyBean myBean() {
return new MyBean(env.getProperty("bean.name"));
}
} 詳細については、Environment および @PropertySource Javadoc を参照してください。@Value アノテーションを使用する @Value アノテーションを使用して、外部化された値を @Configuration クラスに「関連付ける」ことができます。
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Value("${bean.name}") String beanName;
@Bean
public MyBean myBean() {
return new MyBean(beanName);
}
} このアプローチは、Spring の PropertySourcesPlaceholderConfigurer を使用する場合に最も役立ちます。通常、<context:property-placeholder/> を使用して XML で有効にします。@ImportResource を使用して Spring XML で @Configuration クラスを作成する方法については、以下のセクションを参照してください。@Value Javadoc を参照してください。PropertySourcesPlaceholderConfigurer などの BeanFactoryPostProcessor 型の操作の詳細については、@Bean Javadoc を参照してください。@Configuration クラスの作成 @Import アノテーションを使用する場合 @Configuration クラスは、Spring XML で <import> が機能する方法とは異なり、@Import アノテーションを使用して構成できます。@Configuration オブジェクトはコンテナー内で Spring Bean として管理されるため、インポートされた構成は通常の方法で(たとえば、コンストラクターの注入を介して)注入されます。
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return DataSource
}
}
@Configuration
@Import(DatabaseConfig.class)
public class AppConfig {
private final DatabaseConfig dataConfig;
public AppConfig(DatabaseConfig dataConfig) {
this.dataConfig = dataConfig;
}
@Bean
public MyBean myBean() {
// reference the dataSource() bean method
return new MyBean(dataConfig.dataSource());
}
} これで、Spring コンテキストに対して AppConfig のみを登録することにより、AppConfig とインポートされた DatabaseConfig の両方をブートストラップできます。new AnnotationConfigApplicationContext(AppConfig.class);
@Profile アノテーションを使用する場合 @Configuration クラスは @Profile アノテーションでマークされ、特定のプロファイルがアクティブな場合にのみ処理されることを示します。
@Profile("development")
@Configuration
public class EmbeddedDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return embedded DataSource
}
}
@Profile("production")
@Configuration
public class ProductionDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return production DataSource
}
} または、@Bean メソッドレベルでプロファイル条件を宣言することもできます。同じ構成クラス内の代替 Bean バリアントの場合:
@Configuration
public class ProfileDatabaseConfig {
@Bean("dataSource")
@Profile("development")
public DataSource embeddedDatabase() { ... }
@Bean("dataSource")
@Profile("production")
public DataSource productionDatabase() { ... }
} 詳細については、@Profile および Environment javadoc を参照してください。@ImportResource アノテーションを使用した Spring XML@Configuration クラスは、Spring XML ファイル内の通常の Spring <bean> 定義として宣言できます。@ImportResource アノテーションを使用して、Spring XML 構成ファイルを @Configuration クラスにインポートすることもできます。XML からインポートされた Bean 定義は、通常の方法で注入できます(たとえば、Inject アノテーションを使用)。
@Configuration
@ImportResource("classpath:/com/acme/database-config.xml")
public class AppConfig {
@Inject DataSource dataSource; // from XML
@Bean
public MyBean myBean() {
// inject the XML-defined dataSource bean
return new MyBean(this.dataSource);
}
}@Configuration クラスを使用 @Configuration クラスは、次のように相互にネストできます。
@Configuration
public class AppConfig {
@Inject DataSource dataSource;
@Bean
public MyBean myBean() {
return new MyBean(dataSource);
}
@Configuration
static class DatabaseConfig {
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder().build();
}
}
} このような配置をブートストラップする場合、アプリケーションコンテキストに対して登録する必要があるのは AppConfig のみです。ネストされた @Configuration クラスであるため、DatabaseConfig は自動的に登録されます。これにより、AppConfig DatabaseConfig 間の関連がすでに暗黙的に明確になっている場合に、@Import アノテーションを使用する必要がなくなります。 また、ネストされた @Configuration クラスを使用して、@Profile アノテーションを効果的に使用し、同じ Bean の 2 つのオプションを外側の @Configuration クラスに提供することもできます。
デフォルトでは、@Bean メソッドはコンテナーのブートストラップ時に積極的にインスタンス化されます。これを回避するには、@Configuration を @Lazy アノテーションと組み合わせて使用して、クラス内で宣言されたすべての @Bean メソッドがデフォルトで遅延初期化されることを示します。@Lazy は、個々の @Bean メソッドでも使用できることに注意してください。
@Configuration クラスのテストサポート spring-test モジュールで使用可能な Spring TestContext フレームワークは、@ContextConfiguration アノテーションを提供します。これは、Spring 3.1 の時点で、@Configuration Class オブジェクトの配列を受け入れることができます。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class})
public class MyTests {
@Autowired MyBean myBean;
@Autowired DataSource dataSource;
@Test
public void test() {
// assertions against myBean ...
}
} 詳細については、TestContext フレームワークのリファレンスドキュメントを参照してください。@Enable アノテーションを使用して組み込み Spring 機能を有効にする@Enable" アノテーションを使用して @Configuration クラスから有効化および構成できます。詳細は @EnableAsync、@EnableScheduling、@EnableTransactionManagement、@EnableAspectJAutoProxy、@EnableWebMvc を参照してください。@Configuration クラスを作成する際の制約 static として宣言する必要があります。@Bean メソッドは、さらに構成クラスを作成しない場合があります(そのようなインスタンスは、構成アノテーションが検出されないまま、通常の Bean として扱われます)。Bean, Profile, Import, ImportResource, ComponentScan, Lazy, PropertySource, AnnotationConfigApplicationContext, ConfigurationClassPostProcessor, Environment, ContextConfigurationpublic abstract StringSE value
カスタム名が適用されるのは、Configuration クラスがコンポーネントスキャンによって取得されるか、AnnotationConfigApplicationContext に直接提供される場合のみです。Configuration クラスが従来の XML Bean 定義として登録されている場合、Bean 要素の名前 / ID が優先されます。
DefaultBeanNameGenerator