Spring IOC原理解析とカスタムIOC実例説明


目次
一、IOC総合案内
1、総括的な紹介
2、使用技術の原理紹介
3、IOCの通俗的な説明
4、IOCの枠組みを使う上で注意すべき点
二、カスタムIOCの実現(反射+工場モード+propertiesプロファイル)
1、注入する対象AccountDao
2、propertiesプロファイルresourceの下
3、カスタムMyBeanFactory生成オブジェクト
4、シミュレーションにオブジェクト注入が必要な場合:
一、IOC総合案内
1、総括的な紹介
制御反転(Inversion of Control、IOCと略す):オブジェクトを作成する権利をフレームワークに渡すことは、オブジェクト向けプログラミングにおける設計原則であり、コンピュータコード間の結合度を低減するために使用することができる.
IOCの1つのポイントは、システム運用において、注入に依存してあるオブジェクトに必要な他のオブジェクトを動的に提供することです.その実現原理は工場モード+反射+xml解析または注釈解析である.
概要:1、プロファイルを読み込む2、プロファイルを遍歴してbeanPath(オブジェクトのフルパス名)を得る3、反射によってオブジェクトを取得し、beanコンテナに格納する4、オブジェクトが必要な場合はgetBean注入オブジェクトを呼び出す.
2、使用技術の原理紹介
以下の技術については、本明細書に記載されている内容を理解するために使用されます.
  • javaの反射機構
  • 設計モデル——工場モデル
  • 設計モード——代理モード
  • 3、IOCの通俗的な説明
    まずIoCについてお話ししたいと思います(Inversion of Control、制御逆転).これはspringの核心であり、一貫して貫かれている.IoCとは、springフレームワークにとって、springが対象のライフサイクルと対象との関係を制御することである.これはどういう意味なのか、簡単な例を挙げると、私たちはどのように彼女を探しているのか.よく見られるのは、どこがきれいで体がきれいで、はいmm、それから彼女たちの趣味、qq号、電話番号、ip号、iq号......、方法を考えて彼女たちを知って、その好きなものを送って、それからへへ......この過程は複雑で奥深くて、私たちは自分で設計してすべての一環に直面しなければなりません.従来のプログラム開発でも、1つのオブジェクトで別のオブジェクトを使用する場合は(自分でnewするか、JNDIから1つ検索する)、使用後はオブジェクトを破棄(Connectionなど)し、オブジェクトは常に他のインタフェースやレンコンと結合しています.
    ではIoCはどのようにして作られたのでしょうか.結婚相談で彼女を探しているように、私と彼女の間に第三者:結婚紹介所を導入しました.婚介は多くの男女の資料を管理して、私は婚介に1つのリストを提出することができて、それに私がどんな彼女を探したいかを教えて、例えば李嘉欣に似ていて、体は林熙雷のようで、歌は周杰倫のようで、スピードはカルロスのようで、技術はジダンのようで、それから婚介は私たちの要求に従って、mmを提供して、私达は彼女と恋をするだけで、結婚すればいい.簡単明瞭で、結婚紹介者が私たちに与えた人選が要求に合わなければ、私たちは異常を投げ出すことになります.全体の過程は私自身がコントロールするのではなく、結婚仲介のような容器のような機構がコントロールしています.Springが提唱している開発方式は、すべてのクラスがspringコンテナに登録され、springに何が必要なのか、何が必要なのかを教え、springはシステムが適切に動作している間に、あなたが望んでいるものを自分から渡し、同時に他のあなたが必要なものに渡します.すべてのクラスの作成、破棄はspringによって制御されます.つまり、オブジェクトのライフサイクルを制御するのは、参照されるオブジェクトではなくspringです.特定のオブジェクトでは、以前は他のオブジェクトを制御していたが、現在はすべてのオブジェクトがspringによって制御されているため、制御反転と呼ばれています.もしあなたがまだ分からないなら、私は諦めることにしました.
    IoCの1つのポイントは、システムの実行中に、あるオブジェクトに必要な他のオブジェクトを動的に提供することです.この点はDI(Dependency Injection、依存注入)で実現されます.たとえば、オブジェクトAはデータベースを操作する必要があります.以前は、常にAでコードを自分で作成してConnectionオブジェクトを得る必要がありました.springがあれば、springに伝えるだけです.AにはConnectionが必要です.このConnectionがどのように構築され、いつ構築されるかは、Aは知る必要はありません.システムの実行時、spring適切なタイミングでConnectionを作り、注射のようにAに注射することで、各オブジェクト間の関係の制御が完了します.Aは正常に動作するにはConnectionに依存する必要がありますが、このConnectionはspringによってAに注入され、依存注入の名前はこのように来ています.ではDIはどのように実現したのでしょうか.Java 1.3の後の重要な特徴は反射(reflection)であり、プログラムが実行時に動的にオブジェクトを生成し、オブジェクトを実行する方法、オブジェクトの属性を変更することを可能にし、springは反射によって注入を実現する.
    ここの内容は作者:スーパーグーグルソース:CSDN原文:https://blog.csdn.net/it_man/article/details/4402245
    4、IOCの枠組みを使う上で注意すべき点
    1、IOC容器生成対象が反射方式であるため、運転効率に一定のロスがある.運用効率を追求するには、これを考慮する必要があります.
    2、具体的にはIOCフレームワーク製品(例えばSpring)にとって、大量の配合作業が必要で、煩雑で、いくつかの小さなプロジェクトにとって、客観的にいくつかの作業コストを増加する可能性がある.
    3、IOCフレームワーク製品自体の成熟度を評価する必要があり、未熟なIOCフレームワーク製品を導入すれば、プロジェクト全体に影響を及ぼすため、これも隠れたリスクである.
    私たちは大体このような結論を出すことができます:いくつかの仕事量の少ないプロジェクトや製品は、IOCの枠組み製品を使用するのにあまり適していません.また、チームメンバーの知識能力が不足している場合、IOCフレームワーク製品に対する深い理解が不足している場合は、むやみに導入しないでください.最後に、特に運行効率を強調する項目や製品も、WEB 2のようなIOCフレームワーク製品の導入にはあまり適していない.0サイトはこのような状況です.
    二、カスタムIOCの実現(反射+工場モード+propertiesプロファイル)
    1、注入する対象AccountDao
    package test.myIoc;
    
    public class AccountDao {
        //      ,      
        void show(){
            System.out.println("accoutDao    ");
        }
    }

    2、propertiesプロファイルresourceの下
    accountDao=test.myIoc.AccountDao

    3、カスタムMyBeanFactory生成オブジェクト
    コードのコメントを詳しくお読みください
    package test.myIoc;
    
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    /**
     *   Bean  
     *     :              dao
     *      key(    )=value(    )
     *     :        ,      
     *
     */
    public class MyBeanFactory {
    
        private static Properties prop = new Properties();
        private static Map beans ;
        static{
            try{
                InputStream in = MyBeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
                //1、      
                prop.load(in);
                //2、       
                beans = new HashMap();
                //3、    
                Enumeration keys = prop.keys();
                //  key
                while (keys.hasMoreElements()){
                    //  key
                    String key = keys.nextElement().toString();
                    //4、  key  value
                    String beanPath = prop.getProperty(key);
                    //5、      
                    Object o = Class.forName(beanPath).newInstance();
                    //6、    
                    beans.put(key,o );
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        /**
         *          :
         * ApplicationContext:         ,           。
         * BeanFactory:            。
         */
        //  1:7、     ,  
        public static  T getBean(String beanName){
            return (T) beans.get(beanName);
        }
    
        //  2:7、     ,  
    //    public static  T getBean(String beanName){
    //        Object o = null;
    //        try{
    //            String beanPath = prop.getProperty(beanName);
    //            o = Class.forName(beanPath).newInstance();
    //        }catch (Exception e){
    //            e.printStackTrace();
    //        }
    //        return (T) o;
    //    }
    
    }
    

    4、シミュレーションにオブジェクト注入が必要な場合:
    package test.myIoc;
    
    public class Test {
        public static void main(String[] args) {
            AccountDao dao = (AccountDao)MyBeanFactory.getBean("accountDao");
            System.out.println(dao);
            dao.show();
        }
    }
    

    結果:
    test.myIoc.AccountDao@13221655accoutDao注入成功
    ここまで来ると、単純版のIOCが実現したので、ここを見て皆さんはSpring IOCの実現原理について簡単に理解していると信じています.
    (IOCを実現するために工場モデルを使用することについては、ブログを参照してください.https://blog.csdn.net/fuzhongmin05/article/details/61614873)
    プロファイルを読み込み、オブジェクトを生成し、コレクションに格納する詳細な手順は、次のように参照できます.https://blog.csdn.net/it_man/article/details/4402245