zoukankan      html  css  js  c++  java
  • IOC的底层原理

    反射机制的缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且让它满足我们的要求。这类操作总是慢于直接执行相同的操作。

    反射与工厂模式实现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();
            }
        }
    }

    现在就算我们添加任意多个子类的时候,工厂类都不需要修改。使用反射机制实现的工厂模式可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。

            下面编写使用反射机制并结合属性文件的工厂模式(即IoC)。首先创建一个fruit.properties的资源文件:

     

    apple=Reflect.Apple
    orange=Reflect.Orange

    然后编写主类代码:

    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 FileNotFoundException, IOException{
            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 FileNotFoundException, IOException{
            Properties pro=init.getPro();
            fruit f=Factory.getInstance(pro.getProperty("apple"));
            if(f!=null){
                f.eat();
            }
        }
    }

     


     

    IOC的底层原理

    假如类名要改了 那么servlet中也要修改相应的类名,这说明耦合度太高了

    后人用工厂模式,但是耦合度还是有

    所谓高内聚低耦合:低耦合就是一个类尽量不要跟其他类有太多关联,不然修改一个类,其他的类中也要对该类的变化进行修改

    下边就用IOC操作,(原理 面试问题)

    最后将这个对象返回即可

    这样一来得到的对象不是new出来的,而是通过反射出来的对象,这就是ioc的原理。

    https://blog.csdn.net/fuzhongmin05/article/details/61614873

  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/volvane/p/9353124.html
Copyright © 2011-2022 走看看