Spring学習(三)——Springにおける依存注入の方式

40270 ワード

【先の話】
Springは私にとってとても重要で、web関連のプロジェクトについてすべてSpringを使って、毎回Spring関連の知識を見に行って、いつも1知半解を感じて、とても良いシステムが勉強していないで、今少し時間を割いてSpringを勉強します.なぜかSpringに何となく好きになったのは、彼の名前のせいか、希望的な感じがしたからかもしれません.
Spring学習中のまとめと心得,本稿では依存注入とAOPについて学習した後,依存注入の仕方を引き続き学習し,選択的に読んでください.
本文は家畜TTがブログ園で初めて発表し、転載は文章の完全性を維持し、著者:家畜TTを明記してください.リンク:http://www.cnblogs.com/xt0810/p/3628402.html
【関連記事】
Spring学習(一)——Springにおける依存注入の概要
Spring学習(二)——SpringにおけるAOPの初歩的な理解
【依存注入方式】
前の2つの文章の中で、何が注入に依存しているのか、何がAOPなのかを学びました.もちろん、その2つの文章もただ何が問題なのかを紹介しているだけです.私は勉強を通じて、どのようにしているのかを理解したいと思っています.依存注入とは何かまだ理解していない場合は、前の2つの文章を読んだほうがいいです.
1.注入依存方式:
1)設定値注入:IOCコンテナは属性のsetterメソッドを用いて依存するインスタンスを注入する.
2)構造注入:IOCコンテナはコンストラクタを用いて依存するインスタンスを注入する.
3)静的プラント注入:IOC容器は静的プラント法を用いて依存する事例を注入する.
4)インスタンスファクトリ注入方式:IOCコンテナはインスタンスファクトリ手法を用いて依存するインスタンスを注入する.
2.setter注入:
主なコードは以下の通りです.完全なコードは【4つのdemo】を参照してください.
  • Setterのこのような形式の注入の中で、Personクラスは彼がインスタンス化するCarクラス、つまり具体的なクラスAuDiクラスがどこにあるか分からない.彼はインタフェースCarを呼び出しただけで、具体的なインスタンス化はSpringによって行われた.
  • テストでは、MainTestクラスはそれぞれ従来の方法、すなわちSpringを使用しない場合を書き、比較することで、実際には次の等価性を発見することができる:
  • 1 <bean id="person" class="Person">
    
    2        <property name="car" ref="auDi" />
    
    3 </bean>
    
    4 <bean id="auDi" class="AuDi" />

    上下等価:
    1 Person person=new Person();
    
    2 AuDi audi=new AuDi();
    
    3 person.setCar(audi);

    1)   Person.java
     1 public class Person {
    
     2 
    
     3     private Car car;
    
     4     
    
     5     public void setCar(Car car){
    
     6         this.car =car;
    
     7     }
    
     8         
    
     9     public void driver(){
    
    10         car.GuaDang();
    
    11         car.CaiYouMen();
    
    12         car.DaFangXiang();
    
    13     }
    
    14 }

    2)   MainTest.java
     1 import org.springframework.context.ApplicationContext;
    
     2 import org.springframework.context.support.ClassPathXmlApplicationContext;
    
     3 public class MainTest {
    
     4      public static void main(String[] args){
    
     5          //setter        
    
     6          //  Spring           
    
     7          ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
    
     8          Person boy =(Person) context.getBean("person");
    
     9          boy.driver();
    
    10          
    
    11          //          
    
    12          /*Person person=new Person();
    
    13          AuDi audi=new AuDi();
    
    14          person.setCar(audi);
    
    15          person.driver();*/
    
    16          }
    
    17 }

    3)   cartest.xml
     1 <?xml version="1.0" encoding="UTF-8"?>
    
     2 <beans xmlns="http://www.springframework.org/schema/beans"
    
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
     4     xmlns:p="http://www.springframework.org/schema/p"
    
     5     xmlns:context="http://www.springframework.org/schema/context"
    
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
    
     7         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    
     8         http://www.springframework.org/schema/context
    
     9         http://www.springframework.org/schema/context/spring-context-3.0.xsd">    
    
    10     <bean id="person" class="Person">
    
    11         <property name="car" ref="auDi" />
    
    12     </bean>
    
    13     <bean id="auDi" class="AuDi" />
    
    14 </beans>

    3.構造注入:
    主なコードは以下の通りです.完全なコードは【4つのdemo】を参照してください.
  • 構造注入では,Personクラスはインスタンス化するCarクラス,すなわち具体的なクラスAuDiクラスがどこにあるかを知らず,インタフェースCarを呼び出しただけで,具体的なインスタンス化はSpringによって行われた.
  • テストでは、MainTestクラスはそれぞれ従来の方法、すなわちSpringを使用しない場合を書き、比較することで、実際には次の等価性を発見することができる:
  • 1 <bean id="person" class="Person">
    
    2        <constructor-arg ref="Car" />
    
    3 </bean>
    
    4 <bean id="Car" class="AuDi" />

    上下等価:
    1 AuDi audi=new AuDi();
    
    2 Person person=new Person(audi);

    1)   Person.java
     1 public class Person {
    
     2     private Car car;
    
     3     public Person(Car car){//     ,    car,                 
    
     4         this.car =car;//        ,           。
    
     5     }//  Person                ,  Person  ,        ,     Car    。        , Person      。
    
     6     
    
     7     public void driver(){
    
     8         car.GuaDang();
    
     9         car.CaiYouMen();
    
    10         car.DaFangXiang();
    
    11     }
    
    12 }

    2)   MainTest.java
    1 import org.springframework.context.ApplicationContext;
    
    2 import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    3 public class MainTest {
    
    4      public static void main(String[] args){
    
    5          ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
    
    6          Person boy =(Person) context.getBean("person");
    
    7          boy.driver();
    
    8      }
    
    9 }

    3)   cartest.xml
     1 <?xml version="1.0" encoding="UTF-8"?>
    
     2 <beans xmlns="http://www.springframework.org/schema/beans"
    
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
     4     xmlns:p="http://www.springframework.org/schema/p"
    
     5     xmlns:context="http://www.springframework.org/schema/context"
    
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
    
     7         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    
     8         http://www.springframework.org/schema/context
    
     9         http://www.springframework.org/schema/context/spring-context-3.0.xsd">    
    
    10     <bean id="person" class="Person">
    
    11         <constructor-arg ref="Car" />
    
    12     </bean>
    
    13     <bean id="Car" class="AuDi" />
    
    14 </beans>

    4.静的工場注入:
    主なコードは以下の通りです.完全なコードは【4つのdemo】を参照してください.
    MainTestクラスではSpringを使うのと使わないの違いがわかります.
    1)   CarFactory.java
     1 public class CarFactory {
    
     2     public static Car getCarInstance(String type){//    ,         CarFactory   ,getCar     。
    
     3         Car carInstance = null;
    
     4         if(type.equals("audi")){
    
     5             carInstance=new AuDi();
    
     6         }else if(type.equals("baoma")){
    
     7             carInstance=new BaoMa();
    
     8         }
    
     9         return carInstance;
    
    10     }
    
    11 }

    2)   MainTest.java
     1 import org.springframework.context.ApplicationContext;
    
     2 import org.springframework.context.support.ClassPathXmlApplicationContext;
    
     3 import org.springframework.beans.factory.xml.XmlBeanFactory;
    
     4 
    
     5 public class MainTest {
    
     6     public static void main(String[] args){
    
     7         //     Spring   
    
     8         //       ,           .
    
     9         /*Car audicar=CarFactory.getCarInstance("audi");
    
    10         audicar.Prepare();
    
    11         audicar.Install();
    
    12         audicar.Color();
    
    13         Car baomacar=CarFactory.getCarInstance("baoma");
    
    14         baomacar.Prepare();
    
    15         baomacar.Install();
    
    16         baomacar.Color();*/
    
    17         
    
    18         //    Spring   
    
    19         //       ,           .
    
    20         ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
    
    21         Car caraudi =(Car) context.getBean("audi");
    
    22         caraudi.Prepare();
    
    23         caraudi.Install();
    
    24         caraudi.Color();
    
    25         Car carbaoma =(Car) context.getBean("baoma");
    
    26         carbaoma.Prepare();
    
    27         carbaoma.Install();
    
    28         carbaoma.Color();
    
    29     }
    
    30 }

    3)   cartest.xml
     1 <?xml version="1.0" encoding="UTF-8"?>
    
     2 <beans xmlns="http://www.springframework.org/schema/beans"
    
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
     4     xmlns:p="http://www.springframework.org/schema/p"
    
     5     xmlns:context="http://www.springframework.org/schema/context"
    
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
    
     7         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    
     8         http://www.springframework.org/schema/context
    
     9         http://www.springframework.org/schema/context/spring-context-3.0.xsd">    
    
    10     <bean id="audi" class="CarFactory" factory-method="getCarInstance">
    
    11     <constructor-arg>
    
    12             <value>audi</value>
    
    13     </constructor-arg>
    
    14     </bean>
    
    15     <bean id="baoma" class="CarFactory" factory-method="getCarInstance">
    
    16     <constructor-arg>
    
    17             <value>baoma</value>
    
    18     </constructor-arg>
    
    19     </bean>
    
    20 </beans>

    5.実例工場注入:
    主なコードは以下の通りです.完全なコードは【4つのdemo】を参照してください.
    MainTestクラスではSpringを使うのと使わないの違いがわかります.
    1)   CarFactory.java
     1 public class CarFactory {
    
     2     public  Car getCarInstance(String type){//     
    
     3         Car carInstance = null;
    
     4         if(type.equals("audi")){
    
     5             carInstance=new AuDi();
    
     6         }else if(type.equals("baoma")){
    
     7             carInstance=new BaoMa();
    
     8         }
    
     9         return carInstance;
    
    10     }
    
    11 }

    2)   MainTest.java
     1 import org.springframework.context.ApplicationContext;
    
     2 import org.springframework.context.support.ClassPathXmlApplicationContext;
    
     3 import org.springframework.beans.factory.xml.XmlBeanFactory;
    
     4 
    
     5 public class MainTest {
    
     6     public static void main(String[] args){
    
     7 
    
     8         //     Spring   
    
     9         //              ,       。
    
    10         /*CarFactory carfactory =new CarFactory();
    
    11         Car audicar=carfactory.getCarInstance("audi");
    
    12         audicar.Prepare();
    
    13         audicar.Install();
    
    14         audicar.Color();
    
    15         Car baomacar=carfactory.getCarInstance("baoma");
    
    16         baomacar.Prepare();
    
    17         baomacar.Install();
    
    18         baomacar.Color();*/
    
    19         
    
    20         //    Spring   
    
    21         //              ,       。
    
    22         ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
    
    23         Car caraudi =(Car) context.getBean("audi");
    
    24         caraudi.Prepare();
    
    25         caraudi.Install();
    
    26         caraudi.Color();
    
    27         Car carbaoma =(Car) context.getBean("baoma");
    
    28         carbaoma.Prepare();
    
    29         carbaoma.Install();
    
    30         carbaoma.Color();
    
    31     }
    
    32 }

    3)   cartest.xml
     1 <?xml version="1.0" encoding="UTF-8"?>
    
     2 <beans xmlns="http://www.springframework.org/schema/beans"
    
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
     4     xmlns:p="http://www.springframework.org/schema/p"
    
     5     xmlns:context="http://www.springframework.org/schema/context"
    
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
    
     7         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    
     8         http://www.springframework.org/schema/context
    
     9         http://www.springframework.org/schema/context/spring-context-3.0.xsd">    
    
    10     <bean id="carfactory" class="CarFactory"/>
    
    11     <bean id="audi" factory-bean="carfactory" factory-method="getCarInstance">
    
    12     <constructor-arg>
    
    13             <value>audi</value>
    
    14     </constructor-arg>
    
    15     </bean>
    
    16     <bean id="baoma" factory-bean="carfactory" factory-method="getCarInstance">
    
    17     <constructor-arg>
    
    18             <value>baoma</value>
    
    19     </constructor-arg>
    
    20     </bean>
    
    21 </beans>

    【4つのdemo】
    1.Spring依存注入setterを用いて注入demoを設定
    2.Spring依存注入使用構成注入demo
    3.Spring依存注入静的工場設置注入demo
    4.Spring依存注入使用例工場設置注入demo
    【ネーミングスペース】
    『Spring実戦』ではSpringに対して多くのXMLネーミングスペースを持っており、主に以下の通りである.
    ネーミングスペース
    用途
    aop
    断面を宣言するクラスエージェントと@AspectJ注記をSpring断面の構成要素
    beans
    宣言BeanとアセンブリBeanをサポートし、Springの最も核心であり、最も原始的なネーミングスペースである.
    context
    Springアプリケーションコンテキストの構成には、Beanの自動検出と自動アセンブリ、Springzhujie以外の注入などの構成要素が用意されています.
    jee
    Java EE APIとの統合、例えばJNDIとEJB
    jms
    メッセージドライバを宣言するPOJOの構成要素
    lang
    Groovy、JRuby、貨物BeanShellなどのスクリプトによるBeanの構成をサポート
    mvc
    Spring MVCの機能を有効にします.たとえば、注釈向けコントローラ、ビューコントローラ、ブロッカーなどです.
    oxm
    SpringをサポートするオブジェクトからXMLへのマッピング構成
    tx
    宣言試行トランザクション構成の提供
    util
    コレクションをBeanに構成し、プロパティプレースホルダ要素をサポートするなど、さまざまなツールクラス要素を提供します.
    【参考資料】
         1.『Spring in action』Craig Walls著耿淵張衛浜訳
        2.『軽量級Java EE企業応用実戦』李剛著
    【後ろの話】
    时には自分の勉强が速いと感じて、时には自分の勉强のリズムが遅いことに気づいて、よく努力してもっと多くの技能を学ぶことができることを望んでいます.
    共有:
    芭蕉は丁香結を伸ばさず,同じように春風にそれぞれ心配している.
    ——TT