IOC控制反转(Inversion of Control)
我们传统的javaSE程序等都基本是一种典型的相互依赖的程序,也就是一些相互协作的对象构成的。也就是我们所说的正转,即是通过硬编程new一些对象然后对象间相互依赖。所谓的的控制反转就是把创建和查找对象交给容器。
目的:IOC是一种编程思想,建立一个松散耦合的程序。(高内聚,低耦合的思想)
把对对象的控制权交给IOC容器控制对象的生命周期和对象间的关系
-
通过例子理解:
- 原始社会中,比如我们需要斧子,就得自己设计斧子,打造斧子,最后才能用这把自己做的斧子。这就有点类似JAVA中自己创建一个对象,然后通过new的方式创建一个对象调用对象的方法。
- 在工业社会中,比如我们需要斧子,就的去商店购买一把斧子,而这把斧子就从工厂中生产出来的。这个时候就像是JAVA中工厂模式,需要某些对象时候就通过简单的工厂模式设计,我们只要调用工厂类就可以得到想要的对象。
- 在牛逼的共产主义社会中,我们就只要坐等斧子的到来,全自动的给我们斧子对象,等待IOC容器的注入对象。(无需理会斧子要怎么new一个对象,无需定位工厂类)
DI依赖注入(Dependency Injection)
其实IOC依赖注入和DI控制反转是统一的,在一个运行的IOC容器中,容器能够动态的提供给一些需要的其他对象或者说组件中。这些需要的对象就是通过DI这个方式注入来实现的。至于怎么实现,就是通过JAVA的反射机制来实现的。
- 注入的方式:
- setter设值注入
- 构造注入
- java的反射机制
- 概念:在java运行的过程中,对于任意的类都可以知道他的所有属性和方法,对于任意一个对象都可以调用他的属性和方法,这种动态获取对象和调用对象方法的功能。
- 反射机制获取类有三种方法:
//第一种方式: Classc1 = Class.forName("Employee"); //第二种方式: //java中每个类型都有class 属性. Classc2 = Employee.class; //第三种方式: //java语言中任何一个java对象都有getClass 方法 Employeee = new Employee(); Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
- 创建对象:获取类以后我们来创建它的对象,利用newInstance
Class c =Class.forName("Employee"); //创建此Class 对象所表示的类的一个新实例 Objecto = c.newInstance(); //调用了Employee的无参数构造方法.
- 获取属性:分为所有的属性和指定的属性:
``` /获取整个类 Class c = Class.forName("java.lang.Integer"); //获取所有的属性? Field[] fs = c.getDeclaredFields(); //定义可变长的字符串,用来存储属性 StringBuffer sb = new StringBuffer(); //通过追加的方法,将每个属性拼接到此字符串中 //最外边的public定义 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); //里边的每一个属性 for(Field field:fs){ sb.append("\t");//空格 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 sb.append(field.getName()+";\n");//属性的名字+回车 } sb.append("}"); System.out.println(sb); ``` ``` public static void main(String[] args) throws Exception{ /* User u = new User(); u.age = 12; //set System.out.println(u.age); //get */ //获取类 Class c = Class.forName("User"); //获取id属性 Field idF = c.getDeclaredField("id"); //实例化这个类赋给o Object o = c.newInstance(); //打破封装 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 //给o对象的id属性赋值"110" idF.set(o, "110"); //set //get System.out.println(idF.get(o)); } ```