@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @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
/@Inject
EE を利用することもできます。特に、単一のコンストラクターが存在する場合、オートワイヤーセマンティクスは透過的に適用されます。
@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
, ContextConfiguration
修飾子と型 | オプションの要素と説明 |
---|---|
java.lang.String | value この構成クラスに関連付けられている Spring Bean 定義の名前を明示的に指定します。 |
@AliasFor(annotation=Component.class) public abstract java.lang.String value
カスタム名が適用されるのは、Configuration クラスがコンポーネントスキャンによって取得されるか、AnnotationConfigApplicationContext
に直接提供される場合のみです。Configuration クラスが従来の XML Bean 定義として登録されている場合、Bean 要素の名前 / ID が優先されます。
DefaultBeanNameGenerator