1. 概要

このチュートリアルでは、Spring ApplicationContextインターフェースについて詳しく説明します。

2. ApplicationContextインターフェイス

Springフレームワークの主な機能の1つは、IoC(制御の反転)コンテナーです。 Spring IoCコンテナーは、アプリケーションのオブジェクトを管理する役割を果たします。 依存性注入を使用して、制御の反転を実現します。

インターフェイスBeanFactoryおよびApplicationContext は、SpringIoCコンテナを表します。 ここで、 BeanFactory は、Springコンテナにアクセスするためのルートインターフェイスです。 Beanを管理するための基本的な機能を提供します。

一方、 ApplicationContext は、BeanFactoryのサブインターフェイスです。 したがって、BeanFactoryのすべての機能を提供します。

さらに、より多くのエンタープライズ固有の機能を提供します。 ApplicationContext の重要な機能は、メッセージの解決、国際化のサポート、イベントの公開、およびアプリケーション層固有のコンテキストです。 これが、デフォルトのSpringコンテナとして使用する理由です。

3. 春の豆とは何ですか?

ApplicationContext コンテナーについて詳しく説明する前に、SpringBeanについて知っておくことが重要です。 Springでは、 bean は、Springコンテナがインスタンス化、アセンブル、および管理するオブジェクトです

では、アプリケーションのすべてのオブジェクトをSpring Beanとして構成する必要がありますか? ええと、ベストプラクティスとして、私たちはすべきではありません。

一般に[X7X]Springドキュメントに従って、サービスレイヤーオブジェクト、データアクセスオブジェクト(DAO)、プレゼンテーションオブジェクト、Hibernate SessionFactories、JMSキューなどのインフラストラクチャオブジェクトのBeanを定義する必要があります。前方へ。

また、通常、コンテナ内にきめ細かいドメインオブジェクトを構成するべきではありません。 ドメインオブジェクトを作成してロードするのは、通常、DAOとビジネスロジックの責任です。

次に、このチュートリアルでSpringbeanとして使用する単純なJavaクラスを定義しましょう。

public class AccountService {

  @Autowired
  private AccountRepository accountRepository;

  // getters and setters
}

4. コンテナでのBeanの構成

ご存知のように、 ApplicationContext の主な仕事は、Beanを管理することです。

そのため、アプリケーションはBean構成をApplicationContextコンテナーに提供する必要があります。 Spring Bean構成は、1つ以上のBean定義で構成されます。 さらに、SpringはBeanを構成するさまざまな方法をサポートしています。

4.1. Javaベースの構成

まず、Javaベースの構成から始めます。これは、bean構成の最新かつ最も好ましい方法です。 Spring3.0以降でご利用いただけます。

Java構成は通常、@Configurationクラス内で@Bean注釈付きメソッドを使用します。 メソッドの@Beanアノテーションは、メソッドがSpringBeanを作成することを示します。 さらに、 @Configuration で注釈が付けられたクラスは、SpringBean構成が含まれていることを示します。

次に、AccountServiceクラスをSpringbeanとして定義する構成クラスを作成しましょう。

@Configuration
public class AccountConfig {

  @Bean
  public AccountService accountService() {
    return new AccountService(accountRepository());
  }

  @Bean
  public AccountRepository accountRepository() {
    return new AccountRepository();
  }
}

4.2. 注釈ベースの構成

Spring 2.5では、JavaでBean構成を有効にするための最初のステップとして、アノテーションベースの構成が導入されました。

このアプローチでは、最初にXML構成を介して注釈ベースの構成を有効にします。 次に、Javaクラス、メソッド、コンストラクター、またはフィールドで一連のアノテーションを使用してBeanを構成します。 これらのアノテーションの例としては、 @Component @Controller @Service @Repository @Autowiredがあります。 、および@Qualifier

特に、これらのアノテーションはJavaベースの構成でも使用します。 また、Springは、リリースごとにこれらのアノテーションに機能を追加し続けています。

次に、この構成の簡単な例を見てみましょう。

まず、XML構成 user- bean -config.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"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
  
  <context:annotation-config/>
  <context:component-scan base-package="com.baeldung.applicationcontext"/>

</beans>

ここで、 annotation-configタグは、アノテーションベースのマッピングを有効にします。 component-scan タグは、注釈付きクラスを探す場所もSpringに指示します。

次に、 UserService クラスを作成し、@Componentアノテーションを使用してSpringbeanとして定義します。

@Component
public class UserService {
  // user service code
}

次に、この構成をテストするための簡単なテストケースを作成します。

ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/user-bean-config.xml");
UserService userService = context.getBean(UserService.class);
assertNotNull(userService);

4.3. XMLベースの構成

最後に、XMLベースの構成を見てみましょう。 これは、SpringでBeanを構成する従来の方法です。

明らかに、このアプローチでは、XML構成ファイルですべてのbeanマッピングを実行します。

それでは、XML構成ファイル account- bean -config.xml を作成し、AccountServiceクラスのbeanを定義しましょう。

<?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.xsd">
	  
  <bean id="accountService" class="com.baeldung.applicationcontext.AccountService">
    <constructor-arg name="accountRepository" ref="accountRepository" />
  </bean>
	
  <bean id="accountRepository" class="com.baeldung.applicationcontext.AccountRepository" />
</beans>

5. ApplicationContextの種類

Springは、さまざまな要件に適したさまざまなタイプのApplicationContextコンテナーを提供します。 これらは、ApplicationContextインターフェースの実装です。 それでは、ApplicationContextの一般的なタイプのいくつかを見てみましょう。

5.1. AnnotationConfigApplicationContext

まず、Spring3.0で導入されたAnnotationConfigApplicationContextクラスを見てみましょう。 @ Configuration、 @ Component、、およびJSR-330メタデータで注釈が付けられたクラスを入力として受け取ることができます。

それでは、AnnotationConfigApplicationContextコンテナーをJavaベースの構成で使用する簡単な例を見てみましょう。

ApplicationContext context = new AnnotationConfigApplicationContext(AccountConfig.class);
AccountService accountService = context.getBean(AccountService.class);

5.2. AnnotationConfigWebApplicationContext

AnnotationConfigWebApplicationContext は、AnnotationConfigApplicationContextのWebベースのバリアントです。

このクラスは、SpringのContextLoaderListenerサーブレットリスナーまたはSpringMVCDispatcherServletweb.xmlファイルで構成するときに使用できます。

さらに、Spring 3.0以降では、このアプリケーションコンテキストコンテナをプログラムで構成することもできます。 WebApplicationInitializerインターフェイスを実装するだけです。

public class MyWebApplicationInitializer implements WebApplicationInitializer {

  public void onStartup(ServletContext container) throws ServletException {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(AccountConfig.class);
    context.setServletContext(container);

    // servlet configuration
  }
}

5.3. XmlWebApplicationContext

WebアプリケーションXMLベースの構成を使用する場合は、XmlWebApplicationContextクラスを使用できます。

実際のところ、このコンテナーの構成は AnnotationConfigWebApplicationContext クラスのみに似ています。つまり、 web.xml、で構成するか、WebApplicationInitializerインターフェースを実装できます。 :

public class MyXmlWebApplicationInitializer implements WebApplicationInitializer {

  public void onStartup(ServletContext container) throws ServletException {
    XmlWebApplicationContext context = new XmlWebApplicationContext();
    context.setConfigLocation("/WEB-INF/spring/applicationContext.xml");
    context.setServletContext(container);

    // Servlet configuration
  }
}

5.4. FileSystemXMLApplicationContext

FileSystemXMLApplicationContext クラスを使用して、ファイルシステムまたはURLからXMLベースのSpring構成ファイルをロードします。 このクラスは、ApplicationContextをプログラムでロードする必要がある場合に役立ちます。 一般に、テストハーネスとスタンドアロンアプリケーションは、このための可能なユースケースの一部です。

たとえば、このSpringコンテナを作成し、XMLベースの構成のBeanをロードする方法を見てみましょう。

String path = "C:/myProject/src/main/resources/applicationcontext/account-bean-config.xml";

ApplicationContext context = new FileSystemXmlApplicationContext(path);
AccountService accountService = context.getBean("accountService", AccountService.class);

5.5. ClassPathXmlApplicationContext

クラスパスからXML構成ファイルをロードする場合は、ClassPathXmlApplicationContextクラスを使用できます。 FileSystemXMLApplicationContext、と同様に、JARに埋め込まれたアプリケーションコンテキストだけでなく、テストハーネスにも役立ちます。

それでは、このクラスの使用例を見てみましょう。

ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/account-bean-config.xml");
AccountService accountService = context.getBean("accountService", AccountService.class);

6. ApplicationContextの追加機能

6.1. メッセージの解決

ApplicationContext インターフェースは、MessageSourceインターフェースを拡張することにより、メッセージ解決と国際化をサポートします。 さらに、Springは2つの MessageSource 実装、ResourceBundleMessageSourceStaticMessageSourceを提供します。

StaticMessageSource を使用して、プログラムでメッセージをソースに追加できます。 ただし、基本的な国際化をサポートしており、本番環境での使用よりもテストに適しています。

一方、 ResourceBundleMessageSourceは、MessageSourceの最も一般的な実装です。 これは、基盤となるJDKのResouceBundle実装に依存しています。 また、MessageFormatによって提供されるJDKの標準メッセージ解析も使用します。

次に、MessageSourceを使用してプロパティファイルからメッセージを読み取る方法を見てみましょう。

まず、クラスパスにmessages.propertiesファイルを作成します。

account.name=TestAccount

次に、AccountConfigクラスにbean定義を追加します。

@Bean
public MessageSource messageSource() {
  ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
  messageSource.setBasename("config/messages");
  return messageSource;
}

3番目に、MessageSourceAccountServiceに挿入します。

@Autowired
private MessageSource messageSource;

最後に、getMessageメソッドをAccountServiceの任意の場所で使用して、メッセージを読み取ることができます。

messageSource.getMessage("account.name", null, Locale.ENGLISH);

SpringはReloadableResourceBundleMessageSourceクラスも提供します。これにより、Springリソースの任意の場所からファイルを読み取ることができ、バンドルプロパティファイルのホットリロードがサポートされます。

6.2. イベント処理

ApplicationContext は、ApplicationEventクラスとApplicationListenerインターフェイスを使用して、イベント処理をサポートします。  ContextStartedEvent ContextStoppedEvent ContextClosedEvent RequestHandledEventなどの組み込みイベントをサポートします。 さらに、ビジネスユースケースのカスタムイベントもサポートします。

7. 結論

この記事では、SpringのApplicationContextコンテナのさまざまな側面について説明しました。 また、AppicationContextでSpringBeanを構成する方法のさまざまな例についても説明しました。 最後に、さまざまなタイプのApplicationContextを作成して使用する方法を学びました。

いつものように、完全なコードはGitHubから入手できます。