在网上看了很多反射的资料,尝试手撕一下简易版的ioc。
IOC(控制反转)
(1)IOC就是控制反转。就是对象的创建权反转交给Spring,由容器控制程序之间的依赖关系,作用是实现了程序的解耦合,而非传统实现中,由程序代码直接操控。(依赖)控制权由应用代码本身转到了外部容器,由容器根据配置文件去创建实例并管理各个实例之间的依赖关系,控制权的转移,是所谓反转,并且由容器动态的将某种依赖关系注入到组件之中。BeanFactory是SpringIoC容器的具体实现与核心接口,提供了一个先进的配置机制,使得任何类型的对象的配置成为可能,用来包装和管理各种bean。
(2)最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,这里用的就是java的反射机制,通过反射在运行时动态的去创建、调用对象。spring就是根据配置文件在运行时动态的去创建对象,并调用对象的方法的。
控制反转的方式?
Spring的IOC有三种注入方式:
第一是根据属性注入,也叫set方法注入;
第二种是根据构造方法进行注入;
第三种是根据注解进行注入。
DI机制
DI机制(DependencyInjection,依赖注入):可以说是IoC的其中一个内容,在容器实例化对象的时候主动的将被调用者(或者说它的依赖对象)注入给调用对象。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。
IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
下面是简易版的IOC实现
代码呈现
代码结构:
配置文件信息 classname = 全限定类名 ,methodname = 方法名
iocService
package com.imcode.Service;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class iocService {
public static void main(String[] args) throws Exception {
//创建properties 对象
Properties properties = new Properties();
//读取配置文件以字节流的方式
InputStream in = ClassLoader.getSystemResourceAsStream("pro.properties");
properties.load(in);
//获取配置信息
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//反射创建对象
Class cls = Class.forName(className);
Object o = cls.newInstance();
Method method = cls.getMethod(methodName);
method.invoke(o);//执行方法
}
}
boy
package com.imcode.entity;
public class boy {
private String name;
private int age;
public boy() {
}
public boy(String name, int age) {
this.name = name;
this.age = age;
}
public void game(){
System.out.println("game...");
}
}
girl
package com.imcode.entity;
public class girl {
private String name;
private int age;
public girl() {
}
public girl(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "girl{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void lose_weight(){
System.out.println("lose_weight...");
}
public void eat(String sports){
System.out.println("lose_weight..." + sports );
}
}
下图boy为例
运行结果:
girl
运行结果:
其中主要还是用到反射机制,把反射理解清楚就比较好理解代码。