Spring学習6-beanの自動アセンブリ

10295 ワード

Spring:自動アセンブリ
Beanの自動アセンブリ
  • 自動アセンブリはspringを用いてbean依存性を満たす方法
  • である.
  • springは、アプリケーションコンテキストでbeanに依存するbeanを探します.

  • Springのbeanには、次の3つのアセンブリメカニズムがあります.
  • はxmlで明示的に構成されている.
  • javaで明示的に構成されています.
  • 暗黙的なbean発見メカニズムと自動アセンブリ.

  • ここでは主に3つ目の方法について説明します.自動化されたアセンブリbeanです.
    Springの自動アセンブリは、2つの角度から実現するか、2つの操作が必要です.
  • コンポーネントスキャン(component scanning):springは、アプリケーションコンテキストで作成されたbeanを自動的に検出します.
  • 自動組立(autowiring):springはbean間の依存、すなわちIOC/DIを自動的に満たす.

  • コンポーネントスキャンと自動アセンブリの組み合わせは、表示の構成を最小限に抑える大きな威力を発揮します.
    自動アセンブリxml構成ではなく、注記を使用することを推奨する.
    環境構築
    一人でペットを二人持っています
    public class Dog {
        public void shout() {
            System.out.println("wang~");
        }
    }
    public class Cat {
        public void shout() {
            System.out.println("miao~");
        }
    }
    public class Person {
        private Cat cat;
        private Dog dog;
        
        public void setCat(Cat cat) {
            this.cat = cat;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        public Cat getCat() {
            return cat;
        }
    
        public Dog getDog() {
            return dog;
        }
    }

    xml
    
    
        
        
        
            
            
        
    

    テスト
    public class TestAuto {
        @Test
        public void test1(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            Person person = (Person) context.getBean("person");
            person.getCat().shout();
            person.getDog().shout();
        }
    }

    OK、大丈夫
    byName
    Autowire byName(名前による自動アセンブリ)
    xmlを手動で構成する過程で、アルファベットの欠落や大文字と小文字などのエラーが頻繁に発生するため、チェックできず、開発効率が低下する.
    自動アセンブリを使用すると、これらのエラーが回避され、構成が簡単になります.

    テスト
        @Test
        public void test2(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            Person person = (Person) context.getBean("person2");
            person.getCat().shout();
            person.getDog().shout();
        }

    テストに問題はありません.
    ちょっとした修正をする
    catのbean idを修正します
     

    再テストエラーjava.lang.NullPointerExceptionbyNameルールではsetメソッドに対応していないと、本格的なsetCatは実行されず、オブジェクトは初期化されないため、呼び出し時にポインタエラーが報告されます.
    まとめ:
    beanノードにautowire byNameのプロパティがある場合.
  • は、setCatなどのクラス内のすべてのsetメソッド名を検索し、setを削除し、頭文字を小文字にする文字列、すなわちcatを取得する.
  • springコンテナから、この文字列名idのオブジェクトがあるかどうかを探します.
  • があれば、注入を取り出します.ない場合は、空のポインタ異常を報告します.

  • byType
    Autowire byType(タイプ別自動組立)
    Autowire byTypeを使用するには、springコンテナで一意のオブジェクトが同じタイプであることをまず保証する必要があります.
    ユニークでない場合は、ユニークでない例外NoUniqueBeanDefinitionExceptionが報告されます.

    テスト、問題なし
        @Test
        public void test3(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            Person person = (Person) context.getBean("person3");
            person.getCat().shout();
            person.getDog().shout();
        }

    このときcat 2を登録します
        
        

    実行、エラーメッセージ
    NoUniqueBeanDefinitionException

    注記catを削除
        
        

    テストは、合格できます.タイプ別に組み立てられているので、異常は報告されず、最後の結果にも影響しません.id属性を削除しても結果には影響しません.
    注釈の使用
    jdk 1.5は注釈のサポートを開始し、spring 2.5は注釈の全面的なサポートを開始します.
    注釈を使用するには、コンフィギュレーションファイルにcontextファイルヘッダを導入し、ideaにと直接書く必要があります.
    そして注釈のサポートを開く
    @Autowired
  • @Autowiredはタイプ別に自動的にアセンブリされ、idマッチングはサポートされていません.
  • spring-aopのパッケージをインポートする必要があります!
  • 同じタイプのbeanが複数存在する場合、クラス名小文字のbean
  • が自動的にアセンブリされます.
    新しいPsersonクラスを作成し、setterを削除します.
    public class Person2 {
        @Autowired
        private Cat cat;
        @Autowired
        private Dog dog;
    
        public Cat getCat() {
            return cat;
        }
    
        public Dog getDog() {
            return dog;
        }
    }

    プロファイルを再作成しますbeans.xml
    
    
        
        
        
        
    

    テスト、問題なし
        @Test
        public void test4(){
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
            Person2 person2 = (Person2) context.getBean("person2");
            person2.getCat().shout();
            person2.getDog().shout();
        }

    @Autowired拡張
    @Autowiredプロパティrequiredを設定できます
    説明:
    false、オブジェクトnull;
    true、オブジェクトはオブジェクトを保存する必要があります.nullではありません.
    //       null,  required = false,   true
    @Autowired(required = false)
    private Cat cat;

    @Qualifier
  • @Autowiredはタイプによって自動的に組み立てられ、@Qualifierを加えるとbyNameによって
  • を自動的に組み立てることができます.
  • @Qualifierは単独では使用できません.

  • プロファイルbeans.xml変更内容、dog 2とcat 2の追加
        
        
        
        
        
        

    実行、@autowiredはデフォルトタイプの小文字のbeanを自動的にアセンブリします.
    もう一度変更して、タイプがオブジェクトに存在することを保証します.名前はクラスのデフォルトの名前ではありません!
        
        
        
        
        
        

    このときPerson 2に@qualifierと書かれていないと、エラーとなります
    属性にQualifier注記を追加する
        @Autowired
        @Qualifier(value = "cat2")
        private Cat cat;
        @Autowired
        @Qualifier(value = "dog2")
        private Dog dog;

    これでテストは問題ありません
    @Resource
  • @Resourceで指定したname属性がある場合は、byName方式でアセンブリを検索します.
  • 次にデフォルトのbyName方式で組み立てる.
  • 以上が成功しなければbyType方式で自動的に組み立てる.
  • が成功しなければ、異常を報告します.

  • エンティティークラス
    public class Person3 {
        //       null,  required = false,   true
        @Resource(name = "cat2")
        private Cat cat;
        @Resource
        private Dog dog;
    
        public Cat getCat() {
            return cat;
        }
    
        public Dog getDog() {
            return dog;
        }
    }

    新しいプロファイルbeans 2.xmlを作成
    
    
        
        
        
        
        
    

    テスト、問題なし
        //@resource
        @Test
        public void test5(){
            ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
            Person3 person3 = (Person3) context.getBean("person3");
            person3.getCat().shout();
            person3.getDog().shout();
        }

    このときcat 2を削除
        
        
        
        
    

    エンティティークラスは注記のみを保持
        @Resource//(name = "cat2")
        private Cat cat;
        @Resource
        private Dog dog;

    テスト、まだ問題ありません
    結論:byName検索を先に行い、失敗した.さらにbyType検索を行い、成功しました.
    小結
    @Autowiredと@Resourceの違い:
  • @Autowiredと@Resourceはbeanのアセンブリに使用できます.フィールドに書くか、setterメソッドに書くことができます.
  • @Autowiredデフォルトはタイプ別にアセンブリされています(spring仕様に属します)、デフォルトでは依存オブジェクトが存在する必要があります.null値を許可する場合は、@Autowired(required=false)などのrequiredプロパティをfalseとして設定できます.名前付きアセンブリを使用する場合は、@Qualifier注記と組み合わせて
  • を使用できます.
  • @Resource(J 2 EE復帰に属する)は、デフォルトでは名前に従ってアセンブリされ、名前はname属性で指定できます.nameプロパティが指定されていない場合、デフォルトではフィールド名で検索され、setterメソッドにデフォルトではプロパティ名でアセンブリされます.名前に一致するbeanが見つからない場合、タイプに従ってアセンブリされます.ただし、nameプロパティが指定されると、名前のみでアセンブリされます.

  • これらの役割は、同じようにオブジェクトに注釈で注入されますが、実行順序は異なります.@Autowired先byType,@Resource先byName.