关于IOC的个人深层理解

我自己对于IOC的理解

面向对象的设计有一个特点就是各个对象协同工作亦,比如一个类中有一个集合类亦或另一个类,如果再多来几层,那么就好比机械齿轮结构,少一个齿轮就不能正常工作,牵一发而动全身,面向对象设计也类似。

高内聚低耦合一直是软件设计好坏的标准,因此IOC存在就是为了降低对象耦合度

IOC控制反转比如:,男(A类)女(B类)到了谈婚论嫁的年纪,男的要找合适的女子(A类需要B类),女的要找合适的男子(B类需要A类或者C),就要自己找(new),这个过程是非常烦人的,,那么媒婆(IOC)的出现,也就是第三方,他帮你连线,像是月老,A和B没有直接关系,他们是由媒婆(IOC)进行联系在一起的,这个new的过程全部交给IOC进行处理。

DI依赖注入这是IOC的别名,他们是同一个概念.比如在SpringBoot中的Controller方法中@Autowired一个对象也就是自动注入,那么IOC则会自动创建对象,运行项目时就可以直接使用这个类对象。

比如现在USB接口标准化,都长一个样,电脑连一个U盘,或者USB风扇.就可以实现对应的功能,就是因为DI帮忙注入其该有的功能,底层怎么实现这就归结到以下的问题.

IOC或者说DI底层是怎么实现的?

反射+工厂模式

我就用USB来举例工厂模式

interface USB{
    public abstract void 功能();
} 
class U盘 implements USB{
     public void 功能(){
         System.out.println("我能传输文件");
     }
} 
class USB风扇 implements USB{
     public void 功能(){
         System.out.println("我会扇风");
     }
}
class 工厂{
     public static USB getInstance(String usb工具){
         USB u=null;
         if("U盘".equals(usb工具)){
             u=new U盘();
         }
         if("USB风扇".equals(usb工具)){
             u=new USB风扇();
         }
         return u;
     }
}

//main方法
public class Test{
	public static void main(String[] a){
         USB u=工厂.getInstance("U盘");
         u.功能();
     }
  }

插入USB接口,工厂就会自动注入对应功能,也就是创建对应类对象,插入U盘就是U盘的功能.

缺点:我来一个USB充电宝,就要修改工厂类

这就需要反射来实现

此时的工厂类就变成了通过反射实现,这个方法需要配置文件比如properties文件

a=U盘
b=USB风扇
interface USB{
    public abstract void 功能();
} 
class 工厂{
    public static USB getInstance(String usb工具){
        USB u=null;
        try{
            u=(USB)Class.forName(usb工具).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

//main方法
public class Test{
	public static void main(String[] a){
        //首先读取配置文件,怎么读取就不说了
        //根据键获取值
         USB u=工厂.getInstance(a);
         u.功能();
     }
  }
设计模式
java底层
  • 作者:张洪祥(联系作者)
  • 发表时间:2019-11-29 19:48:04
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载请声明本文链接!
  • 评论