1. 概要

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

各インターフェースについて、その使用法の長所と短所とともに個別に説明します。

2. Awareインターフェース

BeanNameAwareBeanFactoryAwareはどちらも、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コンテナに登録されているBeanIDを表します。 私たちの実装では、単にBean名を表示しています。

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

@Configuration
public class Config {

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

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

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

AnnotationConfigApplicationContext context 
  = new AnnotationConfigApplicationContext(Config.class);

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

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

name =“…”コードを@Beanアノテーションから削除すると、この場合、コンテナは 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();

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

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

5. いつ使用しますか?

BeanNameAware の一般的な使用例は、ロギングまたはワイヤリングの目的でBean名を取得することです。 BeanFactoryAware の場合、レガシーコードのSpringBeanを使用できる可能性があります。

ほとんどの場合、必要な場合を除いて、Awareインターフェイスの使用は避けてください。 これらのインターフェースを実装すると、コードがSpringフレームワークに結合されます。

6. 結論

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

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