スプリング組立beanの3つの方法をまとめました。


前言
この時間はSpringを勉強しています。注入DIと面向けプログラミングAOPはSpringフレームの一番核心部分です。今回は主に注入依存バーンの組み立てをまとめた。
注入依存とは?制御反転とも言えるが、簡単に言えば、やや複雑な業務ロジックを完成させるには、複数のクラスが必要であり、他のクラスの例を引用するクラスもあり、他のクラスに依存するとも言える。従来の方法は、直接にそのクラスのオブジェクトを自分の属性として参照することですが、このクラスのオブジェクトを作成するたびに、依存するクラスのオブジェクトを作成します。また、そのクラスは将来は使わないかもしれません。また、このクラスにこのオブジェクトを削除する必要があります。コードの多重性を破壊し、高度結合をもたらします。
注入依存の出現はこの問題をうまく解決できます。注入に依存することは、システムが協調系の依存対象の作成を担当しています。私達は自分で表示する必要がない依存対象を作成するのではなく、システムがこのオブジェクトを注入し、システムがこのオブジェクトの創建を制御してくれます。制御反転ともいいます。
Springは私達に注入する対象に3つの方式があります。
  • 暗黙的なbeanスキャン発見メカニズムと自動組立
  • は、javaにおいて表示構成
  • を行う。
  • XMLに表示構成
  • を行う。
    最初の種類:
    springは2つの角度から自動化組立を実現します。
    クラスに@Componentを注記すると、このクラスはコンポーネントクラスとして、springはこのクラスにbeanを作成します。アプリケーションでこのbeanを引用すると、springは事前に指定されたパケットを自動的にスキャンしてこのbeanを検索する。しかし、springはデフォルトではコンポーネントスキャンを有効にしないので、XMLに<context:component-scan base-package="xx"/>を配置することができます。もう一つの方法があります。新しい配置類の中で、何も書かなくてもいいです。配置類に@ComponentScan注解を加えると、springは自動的に配置類のあるカバンをスキャンして直します。以下は、BBsフォーラムシステムのユーザが投稿する機能の小さい例である。
    
    package bbs.dao;
    @Component
    public interface Postdao {
     /*
     *     ,post       
     */
     public int addpost(@Param("title") String title,@Param("content") String content,@Param("userid") int userid);
    }
    
    package bbs.dao;
    @Component
    public interface Userdao {
     /*
     *      ,user         
     */
     public int addpost(int userid);
    }
    bs.serviceパッケージの中にpostserviceインターフェースとその実現類を作成して、PostdaoとUserdaoに依存します。
    
    package bbs.service;
    public interface PostService {
     /*
          ,                
     */
     public void addpost(String title,String content,int userid);
    }
    
    package bbs.service;
    @Component
    public class PostserviceImpl implements PostService {
    
     private Postdao postdao;
     private Userdao userdao;
    
    // @Autowired
    // public void setPostdao(Postdao postdao)
    // {
    // this.postdao=postdao;
    // }
    //
    // @Autowired
    // public void setUserdao(Userdao userdao)
    // {
    // this.userdao=userdao;
    // }
    
     @Autowired
     public PostserviceImpl(Postdao postdao,Userdao userdao)
     {
     this.userdao=userdao;
     this.postdao=postdao;
     }
    
     public void addpost(String title, String content, int userid) {
     int i=postdao.addpost(title, content, userid);
     int j=userdao.addpost(userid);
     if(i==1&j==1)
      System.out.println("    ");
     else
      System.out.println("    ");
     }
    }
    @Componentはインターフェースで注解すればいいですが、userdao、postdaoインターフェースに加えて、実は削除できます。mybatisを使ってxmlにデータベースを配置して、daoインターフェースを動的に実現します。後でお話しします。上のコードが現れる@Autowired注釈はbean自動組立を実現して、spring応用の文脈の中のコンポーネント種類で需要のbeanを探すことができます。一般的には二つの組み立て方式があります。コンストラクションとセッター方法(他の方法名もいいです。注入されたbeanをこのタイプの属性にすればいいです。)
    springがマッチングしていないbeanを検索しても異常があるかもしれません。@Autowiredにrequired=falseを加えて、マッチングしていないbeanがない場合、springはこのbeanを未装着の状態にしてしまい、組み立てが成功しませんでした。また、同じ名前が出てくる可能性があるbeanはいくつかありますが、曖昧さが生じます。一般的にコンポーネント類には、このbeanのidを書き込み@Qualifier()括弧を追加し、注入時には@Qualifier()を加えて、beanのidを書きます。次のように:
    
    @Component
    @Qualifier("postdao")
    public interface Postdao{
    . . . . 
    }
     
    @Component
    @Qualifier("userdao")
    public interface Userdao{
    . . . . 
    }
    
    @Autowired
    @Qualifier("usedao")
    public void setUserdao(Userdao userdao)
    {. . . 
    }
     
    @Autowired
    @Qualifier("postdao")
    public void setUserdao(Postdao postdao)
    {. . . 
    }
    javaは同じエントリで同じタイプの注釈が重複することが許されないため、すべての注入はset方式を採用する。しかし、ユーザー定義のコメントを作成することができます。ここでは紹介しません。
    第二種類:
    javaコードでbeanを組み立てます。
    普通はコンポーネントスキャンと自動組立方式によって便利になりますが、もし第三者の倉庫の種類を使う必要があるなら、この場合は第三者の倉庫にカテゴリに注釈を付けることができません。第一の方法は使えません。この時は表示組立を採用しなければなりません。javaコードまたはxml表示でbeanを組み立てることができます。javaコードを使って、まず1つの構成クラスJava Configを新たに作って、中はすべて配置の必要なbeanで、業務の論理コードがあるべきでなくて、だから単独で1つの種類を建てます。
    
    @Configuration
    @ContextConfiguration(locations = {"classpath:spring/spring-dao.xml","classpath:scan.xml"})
    public class bbsConfig{
      private Postdao postdao;
      private Userdao userdao;
      @Bean(name="postservice")
     public PostService getPost()
      {
      return new PostserviceImpl(postdao,userdao);
      }
    PostServiceのbean注入時に、二つのbean、postdao、userdaoに依存しました。beanIDをそのまま引用すればいいです。springは自動的に容器からこれらのbeanを取得します。彼らの配置が正しいならいいです。この例では、userdao、postdaoは、Mybatis設定自動スキャンでdaoインターフェース生成エージェントをspringに注入したもので、実はxml組立beanとも言える。この文章を参考にして、よく分かります。https://www.jb51.net/article/157618.htm
    ここでもう一つのbeanを宣言すれば、まだpostserviceImplオブジェクトに戻ります。前のbeanと全く同じです。同じ例です。一般spring@bean同一のbeanIDであれば、デフォルトで戻ってくるのは単一の例beanであり、注入は同じ例である。その中の一つを修正すれば全部変わります。
    ただし、ここで注意してテストを行うときは、スプリングのセルテストとスプリングIoc容器は完全に独立していますので、postdaoとuserdao注入検査の時はlocationsを使ってxmlファイルをロードします。全部テストしなければならないならないなら、別々にテストしましょう。
    第三種類:
    XMLに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
      http://www.springframework.org/schema/context">
     <import resource="spring/spring-dao.xml"/>
    
     <bean id="postservice" class="com.bbs.service.impl.PostserviceImpl">
      <constructor-arg ref="postdao"/>
      <constructor-arg ref="userdao"/>
     </bean>
    </beans>
    postserviceを配置するbeanには、2つのbean、postdao、userdaoを導入し、constructor-argのラベルに入れる必要があります。refとは、依存するbeanのIDです。javaConfigに配置されているなら、@Beanの内容を書きます。@Componentなら@Qualfierの内容を書きます。ここに導入された動的に実現されたdaoインターフェースのbeanです。spring-dao.xmlに配置されています。このプロファイルを導入すれば自動的にbeanIDが得られます。
     混合は3つの組み立てを使用する:
    1.クラスでは@ import(bbsConfig.class)を使用して他のJAVA注釈を組み合わせることができます。
    2.クラスに@ imortResource("classpath:spring-dao.xml")を使って他のxml注解を組み合わせます。
    3.クラスでは@ContenxtConfigurationを使用して、クラスまたはxmlを含むことができます。
    4.xmlには<import resource="spring-dao.xml">でxml注釈を導入することができ、また<bean class="com.bbs.dao.Userdao">を使用してjava注釈を導入することもできる。
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。