SpringのBeanNameAwareおよびBeanFactoryAwareインタフェース

1概要

このクイックチュートリアルでは、 Spring Framework BeanNameAware および BeanFactoryAware インタフェースに焦点を当てます。

それぞれのインターフェースについて、それぞれの長所と短所を分けて説明します。

2 Aware インターフェース

BeanNameAware BeanFactoryAware はどちらも org.springframework.beans.factory.Aware ルートマーカーインタフェースに属します。

これは、アプリケーションコンテキストの起動時にオブジェクトを取得するためにセッターインジェクションを使用します。

  • Aware インタフェースは、コールバック、リスナ、およびオブザーバの設計パターンを組み合わせたものです。これは、Beanがコールバックメソッドを介してSpringコンテナから通知を受ける資格があることを示します。

3 BeanNameAware

  • BeanNameAware は、オブジェクトにコンテナ** で定義されたBean名を認識させる

例を見てみましょう。

public class MyBeanName implements BeanNameAware {

    @Override
    public void setBeanName(String beanName) {
        System.out.println(beanName);
    }
}

beanName プロパティは、Springコンテナに登録されているBeanのIDを表します。この実装では、単にBean名を表示しているだけです。

次に、このタイプのBeanをSpring設定クラスに登録しましょう。

@Configuration
public class Config {

    @Bean(name = "myCustomBeanName")
    public MyBeanName getMyBeanName() {
        return new MyBeanName();
    }
}

ここでは、 @ Bean(name = “ myCustomBeanName”) 行を使用して MyBeanName クラスに名前を明示的に割り当てました。

これでアプリケーションコンテキストを起動し、そこからBeanを取得できます。

AnnotationConfigApplicationContext context
  = new AnnotationConfigApplicationContext(Config.class);

MyBeanName myBeanName = context.getBean(MyBeanName.class);

予想通り、 setBeanName メソッドは “ myCustomBeanName” を出力します。

@ Bean アノテーションから name =“ …​” コードを削除すると、コンテナはこの場合、 getMyBeanName() メソッド名をBeanに割り当てます。そのため、出力は “ getMyBeanName” になります。

4 BeanFactoryAware

  • BeanFactoryAware は、 BeanFactory オブジェクト** をインジェクトするために使用されます。このようにして、オブジェクトを作成した BeanFactory にアクセスします。

これが MyBeanFactory クラスの例です。

public class MyBeanFactory implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public void getMyBeanName() {
        MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);
        System.out.println(beanFactory.isSingleton("myCustomBeanName"));
    }
}

setBeanFactory() メソッドを使用して、IoCコンテナから BeanFactory 参照を beanFactoryプロパティ に割り当てます。

その後、 getMyBeanName() 関数のように直接使用できます。

MyBeanFactory を初期化し、 getMyBeanName() メソッドを呼び出します。

MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();

前の例で M​​yBeanName クラスをすでにインスタンス化したので、Springはここで既存のインスタンスを呼び出します。

beanFactory.isSingleton(“ myCustomBeanName”) 行はそれを検証します。

** 5いつ使う?

BeanNameAware の一般的なユースケースは、ロギングまたは配線の目的でBean名を取得することです。 BeanFactoryAware の場合、それはレガシーコードからのSpring Beanを使用することができるかもしれません。

ほとんどの場合、必要でない限り、 Aware インターフェースの使用を避けるべきです。これらのインタフェースを実装することで、コードをSpringフレームワークに結合します。

6. 結論

この記事では、 BeanNameAware および BeanFactoryAware インターフェース、およびそれらを実際に使用する方法について学びました。

いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/spring-core[over on GitHub]にあります。