spring容器をbeanに取得させる

2724 ワード

場合によっては、容器中のBeanはspring容器自体に自主的にアクセスする必要があるかもしれません.Springもこの需要のために準備しました.
     BenFactoryAwareインターフェースを実現するBeanは、BenFactory容器を訪問する能力を持ち、BenFactoryAwareインターフェースを実現するBeanインスタンスがコンテナによって作成された後、BenFactoryの引用を持つ.BenFactory Awareは次のような方法しかない.
setBenFactory(BenFactory BeanFactory):この方法は、そのBenFactoryを作成することを指すパラメータを有する.注:変更方法はシステムのアクティブな呼び出しです.呼び出しを表示する必要はありません.
ほとんどの初心者はこのsetter方法を見て、ちょっとおかしいと思います.これは以前に私達がsetter方法を定義した時に、この方法は通常プログラマによって呼び出されます.setterパラメータはプログラマによって指定されます.spring依存注入を使用しても、Setterメソッドのパラメータはプロファイルで指定されていますが、ここでのこのsetter方法はおかしいです.この方法はspringからアクティブに呼び出され、spring容器をパラメータとしてこの方法に導入します.このインターフェースと似ているのはBeanNameAware、Resource Loader Awareインターフェースであり、これらのインターフェースはいずれも同様のsetter方法を提供しており、これらの方法もspringによって呼び出される.
      BeanFactoryAwareインターフェースと似ているのは、Application ContactextAwareインターフェースであり、このインターフェースを実現するBeanはこの方法を実現する必要があります.
setApplication Contect(Application Comptext)この方法は同様にspring自動起動があります.この方法は、スプリング容器が呼び出されると、自身をパラメータとしてこの方法に伝えられます.
public class myApplicationContext implements ApplicationContextAware{
    private ApplicationContext applicationContext;

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        System.out.println("         !!");
        this.applicationContext = applicationContext;
    }
}
myAppleicationControtextAwareインターフェースを実現し、このインターフェースが提供する方法を実現し、これにより、Beanインスタンスが直接にそのspring容器にアクセスできるようになる.
このビーンをxmlファイルに設定します.
は簡単なテストを行います.
public class TestClass {


    @Test
    public void testHelloimple2() throws IOException {
        ApplicationContext act= new ClassPathXmlApplicationContext(url);
        System.out.println("=======================================");
        myApplicationContext mact=act.getBean("myapplicationcontext",myApplicationContext.class);
        System.out.println(mact.getApplicationContext());
        System.out.println(act);
        System.out.println(act==mact.getApplicationContext());
    }
}
出力:
         !!
=======================================
org.springframework.context.support.ClassPathXmlApplicationContext@5ecddf8f: startup date [Tue Mar 17 16:56:46 CST 2015]; root of context hierarchy
org.springframework.context.support.ClassPathXmlApplicationContext@5ecddf8f: startup date [Tue Mar 17 16:56:46 CST 2015]; root of context hierarchy
true
Aplication Contect Awareインターフェースを実現してビーンに容器を訪問する能力を持たせましたが、コードを汚染して、コードとspringインターフェースが結合しています.したがって、特に必要でない場合は、直接容器にアクセスしないことをお勧めします.