博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
控制反转(IoC)-解析与实现
阅读量:4292 次
发布时间:2019-05-27

本文共 2612 字,大约阅读时间需要 8 分钟。

控制反转(Inversion of Control)缩写:IoC是面向对象编程中框架级别里的一个重要的概念,

可以说Spring框架的核心就是基于IoC原理的。

这个概念到底是什么呢?

这么讲吧,一个系统的运作肯定不是简单的几个类就可以实现的,它往往需要多个类的合作来实现业务逻辑

。这就使得每个对象都需要与其合作的对象具有相互的关系(依赖关系)。在早前编程中所需要的依赖对象

是通过自身去创建得到的,而现在是通过一个容器来统一管理这些依赖关系。在这整个过程中,对象获得其他对象引用的方式其实就是IoC。

IoC的本质是什么?

控制权的转移。IoC原理是基于面向对象中的设计原则的The Hollywood Principle:Don't call us,we'll call you(别找我,我会来找你的)。

可以这样讲,所有组件的初始化和调用都是由容器负责。在传统实现中类之间的关系是由类自己控制的(需要使用其他类时就自己创建),

但是在IoC中,组件处在容器中,由容器统一管理和调度。这就是"控制反转"的概念所在:控制权由应用代码转移到了容器中,即控制权的转移。

那如何实现IoC这种思想的呢?

实现IoC思想的方式主要有两种:依赖注入和依赖查找。

下面就以依赖注入为例讲解一下:

1 1.先定义一个部门接口: 2  3 public interface IDepartService { 4     //通过员工编号获得部门名字 5     public String getDepartNameByUser(int userId); 6 } 7  8 2.实现该接口: 9 public class DepartServiceImpl implements IDepartService {10 11     @Override12     public String getDepartNameByUser(int userId) {13         if(userId==1){14 return "IT部门";15         }16         return "";17     }18 }19 3.定义一个用户类,该类中要维持部门对象的引用:20 21 public class UserServiceImpl {22     private IDepartService departService;23     24     public void printInfo(int userId){25         System.out.print(getUserName(userId));26         System.out.println(departService.getDepartNameByUser(userId));27     }28     29     public String getUserName(int userId){30         if(userId==1){31 return "张三 ";32         }33         return "";34     }35 }

在用户类中,我们没有看到关于创建DepartService对象的语句。这里面我们没有采用常见的set注入或者构造方法注入,

而是采用反射的方法直接注入并执行的,要实现这个效果的话,我们需要定义一个容器,来管理他们的关系。

4.定义容器,我们在容器中先获取配置文件:public class Container {    ......    private void loadConfig {        // TODO Auto-generated method stub        InputStream is = Container.class.getResourceAsStream("/ioc.properties");        properties = new Properties;        try { properties.load(is);        } catch (Exception e) { // TODO: handle exception        }    }    public Object get(String name) {        String className = (String) properties.get(name);        return Class.forName(className).newInstance; ......    }    public void inject(Object obj) {        Field fields = obj.getClass.getDeclaredFields; ...... for (Field field : fields) { field.setAccessible(true); field.set(obj, get(field.getName)); } ......    }}在上述中,首先获取配置文件中已配置好的依赖关系,然后采用反射技术根据依赖关系进行创建相应的对象5.其中ioc.properties的内容为:departService=com.service.impl.DepartServiceImpl6.查看入口方法:public static void main(String[] args) {        UserServiceImpl user=new UserServiceImpl;            Container container=new Container;        container.inject(user);        user.printInfo(1);}

7.查看结果:

总结:可以说IoC这个思想是一个很伟大的思想,现在很多大神甚至将它归为GoF中(因为IoC出现的比较晚,错过了GoF“四人组”的《Design Patterns: Elements of Reusable Object-Oriented Software》)。

转载地址:http://djggi.baihongyu.com/

你可能感兴趣的文章
(原创)Android6.0亮屏流程分析
查看>>
Intent启动另一个APP里的fragment
查看>>
Android 系统7.0上 屏幕背光流程分析
查看>>
解决升级chrome后,访问https出现Your connection is not private
查看>>
Android 7.0之JobScheduler 分析(一)——如何使用job
查看>>
Android API version 查询
查看>>
【原创】Android 耗电信息统计服务——BatteryStats源码分析(一)
查看>>
Android开发的福音,谷歌隆重推出 Android KTX预览版,让 Kotlin 的开发更美妙!
查看>>
Android面试神器之Rxjava破冰
查看>>
面试神器第二弹:Rxjava熟悉——操作符
查看>>
带你过一遍Android 多主题框架——MagicaSakura
查看>>
这款神器你不学就要落后了!
查看>>
谷歌开源跨平台UI框架——Flutter
查看>>
Android进阶必学:自定义注解之动态代理
查看>>
Android进阶必学:自定义注解之反射
查看>>
Android进阶之注解解析和自定义注解
查看>>
你想成为Android高级工程师你还得学习Hook
查看>>
菜鸟带你Hook技术实战
查看>>
BAT面试题集锦——Java基础(一)
查看>>
BAT面试题集锦——Java基础(二)
查看>>