spirng配置式注入方式

17061 ワード

  • 通常のjava開発では、プログラマがあるクラスで他のクラスに依存する必要がある方法は、newの依存クラスがクラスインスタンスを再呼び出す方法であり、newのクラスインスタンスが統一的に管理されていないという問題があり、springは依存注入の思想を提出した.すなわち、依存クラスはプログラマによってインスタンス化されず、代わりにspringコンテナを使用してnewでインスタンスを指定し、オブジェクトを必要とするクラスにインスタンスを注入します.注入に依存するもう一つの言い方は「制御反転」であり、一般的には、通常、newの一例であり、この例の制御権は私たちのプログラマーであり、制御反転はnewのインスタンスの仕事は私たちのプログラマーがしないでspring容器に渡すことを意味する.

  • Springには様々な依存注入の形式があり、以下ではspringがxmlを通じてIOC配置を行う方法のみを紹介する.
    Set注入方式これは最も簡単な注入方式であり、クラスにSpringDaoオブジェクトをインスタンス化する必要があるSpringActionがあると仮定すると、privateのSpringDaoメンバー変数を定義し、SpringDaoのsetメソッド(iocの注入入口である):
    package com.bless.springdemo.action;  
    public class SpringAction {  
            //    springDao  
        private SpringDao springDao;  
            //          set    
           public void setSpringDao(SpringDao springDao) {  
           this.springDao = springDao;  
       }  
    
           public void ok(){  
           springDao.ok();  
        }  
    }

    次にspringのxmlファイルを作成します.nameプロパティはclassプロパティの別名です.classプロパティはクラスのフルネームを指します.SpringActionに共通プロパティSpringdaoがあるので、ラベルにラベル指定SpringDaoを作成します.
    ラベルのnameはSpringActionクラスのSpringDao属性名で、refは以下を指します.
    これは、SpringがSpringDaoImplオブジェクトをインスタンス化し、SpringActionを呼び出すsetSpringDaoメソッドがSpringDaoを注入することです.
    1   
    2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction">  
    3           
    4        <property name="springDao" ref="springDao">property>  
    5    bean>  
    6 <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl">bean>  

    2、コンストラクタ注入この方式の注入とはパラメータ付きコンストラクタ注入のことで、次の例を見て、2つのメンバー変数SpringDaoとUserを作成しましたが、オブジェクトのsetメソッドは設定されていないので、第1の注入方式はサポートできません.ここでの注入方式はSpringActionのコンストラクタに注入されます.つまり、SpringActionオブジェクトの作成時にSpringDaoとUserの2つのパラメータ値を入力します.
    public class SpringAction {  
              //    springDao  
              private SpringDao springDao;  
              private User user;  
    
              public SpringAction(SpringDao springDao,User user){  
                  this.springDao = springDao;  
                  this.user = user;  
                  System.out.println("      springDao user");  
                }  
    
                    public void save(){  
                    user.setName("  ");  
                    springDao.save(user);  
                }  
            }

    XMLファイルでは同じ形式ではなく、ラベルを使用します.refプロパティは他のラベルのnameプロパティを指します.
      
    <bean name="springAction" class="com.bless.springdemo.action.SpringAction">  
           
         <constructor-arg ref="springDao">constructor-arg>  
         <constructor-arg ref="user">constructor-arg>  
    bean>  
    <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl">bean>  
    <bean name="user" class="com.bless.springdemo.vo.User">bean>

    コンストラクションメソッドパラメータの不確実性を解決するには、コンストラクションメソッドが入力する2つのパラメータが同じタイプであることに遭遇する可能性があります.対応する値を割り当てるには、indexを設定する必要があります.次に、パラメータの位置を設定します.
    1 <bean name="springAction" class="com.bless.springdemo.action.SpringAction">  
    2        <constructor-arg index="0" ref="springDao">constructor-arg>  
    3        <constructor-arg index="1" ref="user">constructor-arg>  
    4 bean> 

    もう1つは、パラメータのタイプを設定することです.
    1 <constructor-arg type="java.lang.String" ref=""/>  
             
    

    静的工場はその名の通り、静的工場を呼び出す方法で自分の必要なオブジェクトを取得し、springにすべてのオブジェクトを管理させるために、私たちは直接「エンジニアリングクラス」を通過することはできません.静的メソッド()はオブジェクトを取得しますが、spring注入の形式で取得します.
     1 package com.bless.springdemo.factory;  
     2     
     3     import com.bless.springdemo.dao.FactoryDao;  
     4     import com.bless.springdemo.dao.impl.FactoryDaoImpl;  
     5     import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;  
     6     
     7     public class DaoFactory {  
     8       //      
     9       public static final FactoryDao getStaticFactoryDaoImpl(){  
    10             return new StaticFacotryDaoImpl();  
    11         }  
    12     }
    

    同じように重要なクラスを見ると、ここではFactoryDaoオブジェクトを注入する必要があります.ここでは最初の注入とそっくりに見えますが、その後のxmlを見ると大きな違いがあります.
     1  public class SpringAction {  
     2         //      
     3    private FactoryDao staticFactoryDao;  
     4       
     5     public void staticFactoryOk(){  
     6        staticFactoryDao.saveFactory();  
     7     }  
     8     //     set    
     9     public void setStaticFactoryDao(FactoryDao staticFactoryDao) {  
    10         this.staticFactoryDao = staticFactoryDao;  
    11     }  
    12 }  
    Spring IOC    ,   <bean name="staticFactoryDao">   class   FactoryDao    ,        DaoFactory,     factory-method="getStaticFactoryDaoImpl"          :
    
    
    1   
    2     <bean name="springAction" class="com.bless.springdemo.action.SpringAction" >  
    3           
    4         <property name="staticFactoryDao" ref="staticFactoryDao">property>  
    5                 property>  
    6     bean>  
    7       
    8     <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl">bean>  
             
    

    インスタンス・ファクトリとは、オブジェクト・インスタンスを取得する方法が静的ではないことを意味します.まずnewファクトリ・クラスを呼び出し、通常のインスタンス・メソッドを呼び出す必要があります.
    1 public class DaoFactory {  
    2     //      
    3     public FactoryDao getFactoryDaoImpl(){  
    4         return new FactoryDaoImpl();  
    5     }  
    6 } 

    では、次のクラスは何も言っていません.前にも似ていますが、インスタンスファクトリクラスを使用してFactoryDaoオブジェクトを作成する必要があります.
     1 public class SpringAction {  
     2     //      
     3     private FactoryDao factoryDao;  
     4       
     5     public void factoryOk(){  
     6         factoryDao.saveFactory();  
     7     }  
     8   
     9     public void setFactoryDao(FactoryDao factoryDao) {  
    10         this.factoryDao = factoryDao;  
    11     }  
    12 }  

    最後にspringプロファイルを見ます.
    1   
    2     <bean name="springAction" class="com.bless.springdemo.action.SpringAction">  
    3           
    4         <property name="factoryDao" ref="factoryDao">property>  
    5     bean>  
    6       
    7       
    8     <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory">bean>  
    9     <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl">bean>  
      
    

    Spring IOC注入方式が最も多く使われているのは(1)(2)種類で、たくさん練習してくれてありがとうございます.また、Springによって作成されたオブジェクトのデフォルトは単一です.複数インスタンスオブジェクトを作成する必要がある場合は、ラベルの後ろに属性を追加できます.
     "..." class="..." scope="prototype">