Spring----シンプルな工場モデルと反射に基づいてIOCを実現


波の品格は、何度も礁に打ち砕かれ、無数の閃きが礁に飛びかかることだ.
いいねを押してからいい習慣をつける
IOCの実現原理を知るには、反射メカニズムと工場モデルを知る必要がある.
反射メカニズムとは:
Javaの実行中に、クラス内のメンバー変数、関数、構築方法を動的に取得したい場合は、反射を使用します.反射は、任意のクラスのすべてのプロパティとメソッドを取得し、オブジェクトに対してオブジェクトの任意のメソッドとプロパティを使用できます.
反射に関する公式の紹介は次のとおりです.
反射はJava言語の特性であり、プログラムを許可します.
実行時(コンパイルではないことに注意)に自己検査を行い、内部のメンバーを操作します.たとえば、Javaクラスがすべてのメンバー変数とメソッドを取得し、表示できます.
反射を利用してより美しく多様なコードを作成することができますが、反射に使用されるクラス名を知る必要があることに注意してください.
反射メカニズムの用途
  • 実行時に判断対象が属するクラス
  • システムプライベートメソッドまたは関数
  • を呼び出す必要がある
  • 実行時にクラスオブジェクト
  • を作成する.
  • 実行時にオブジェクトの属性を取得する方法
  • 反射を使用する理由
    Javaコンパイルタイプには、次の2つがあります.
    1.静的コンパイル:コンパイル時にタイプを確認し、バインドされたオブジェクトは
    2.ダイナミックコンパイル:実行時にタイプを確認し、コードの柔軟性を高めると同時にコードの結合性を低下させ、Javaの多態を体現し、反射はダイナミックコンパイルの代表である.
    反射相関クラス
    Javaの反射メカニズムを実現するクラスはjavaにある.lang.reflectパッケージ:
    クラス名
    用途
    クラス
    クラスのエンティティを表し、Javaの実行中にクラスとインタフェースを表します.
    Fieldクラス
    クラスを表すメンバー変数(メンバー変数はクラスのプロパティとも呼ばれます)
    Methodクラス
    クラスを表す方法
    Constructorクラス
    クラスを表す構造方法
    反射工場とIOC
    SpringでのIOCはファクトリモードと反射メカニズムですが、まず反射メカニズムを使わない場合のファクトリモードを見てみましょう
    interface fruit{
        public abstract void eat();
    } 
    class Apple implements fruit{
         public void eat(){
             System.out.println("Apple");
         }
    } 
    class Orange implements fruit{
         public void eat(){
             System.out.println("Orange");
         }
    }
    //     
    //                     
    //           
    class Factory{
         public static fruit getInstance(String fruitName){
             fruit f=null;
             if("Apple".equals(fruitName)){
                 f=new Apple();
             }
             if("Orange".equals(fruitName)){
                 f=new Orange();
             }
             return f;
         }
    }
    class hello{
         public static void main(String[] a){
             fruit f=Factory.getInstance("Orange");
             f.eat();
         }
    }
    

    欠点は、サブクラスを追加するたびに、ファクトリクラスを変更する必要があります.サブクラスが多すぎると、ファクトリクラスは非常に煩雑になり、メンテナンスに不利になります.次に反射されたファクトリクラスを使用します.
    interface fruit{
         public abstract void eat();
    }
    class Apple implements fruit{
    public void eat(){
             System.out.println("Apple");
         }
    }
    class Orange implements fruit{
    public void eat(){
            System.out.println("Orange");
        }
    }
    class Factory{
        public static fruit getInstance(String ClassName){
            fruit f=null;
            try{
                f=(fruit)Class.forName(ClassName).newInstance();
            }catch (Exception e) {
                e.printStackTrace();
            }
            return f;
        }
    }
    class hello{
        public static void main(String[] a){
            fruit f=Factory.getInstance("Reflect.Apple");
            if(f!=null){
                f.eat();
            }
        }
    }

    反射によってオブジェクトを生成し、工場クラスのコードを変更する必要はありません.作成中に対応するクラスパスを入力するだけで、反射はオブジェクトを生成します.次に、構成をpropertiesに変更します.
    まずfruitを作成する必要がありますproperties、対応するクラスパスを書き込む
    apple=Reflect.Apple
    orange=Reflect.Orange
    以下は工場類と反射シミュレーションを組み合わせてSpringを実現するIOCコードです.
    interface fruit{
        public abstract void eat();
    }
    class Apple implements fruit{
        public void eat(){
            System.out.println("Apple");
        }
    }
    class Orange implements fruit{
        public void eat(){
            System.out.println("Orange");
        }
    }
    //       
    class init{
        public static Properties getPro() throws Exception{
            Properties pro=new Properties();
            File f=new File("fruit.properties");
            if(f.exists()){
                pro.load(new FileInputStream(f));
            }else{
                pro.setProperty("apple", "Reflect.Apple");
                pro.setProperty("orange", "Reflect.Orange");
                pro.store(new FileOutputStream(f), "FRUIT CLASS");
            }
            return pro;
        }
    }
    class Factory{
        public static fruit getInstance(String ClassName){
            fruit f=null;
            try{
                f=(fruit)Class.forName(ClassName).newInstance();
            }catch (Exception e) {
                e.printStackTrace();
            }
            return f;
        }
    }
    class hello{
        public static void main(String[] a) throws Exception{
            Properties pro=init.getPro();
            fruit f=Factory.getInstance(pro.getProperty("apple"));
            if(f!=null){
                f.eat();
            }
        }
    }

    結果:Apple
    IOCの最も基本的な技術は「リフレクション」プログラミングであり、一般的には与えられたクラス名(文字列方式)に基づいて動的にオブジェクトを生成することであり、このプログラミング方式はオブジェクトが生成されたときにどのオブジェクトであるかを決定することができる.Springで生成するオブジェクトは、柔軟性とメンテナンス性を向上させるためにプロファイルで定義されています.
    IOCコンテナの動作パターンを工場パターンの昇華と見なし、IOCコンテナを工場と見なすことができ、この工場で生産する対象はすべてプロファイルに定義され、プログラミング言語で提供される反射メカニズムを利用して、プロファイルに与えられたクラス名に基づいて対応するオブジェクトを生成する