IOC的作用:如下图所示,我们在创建对象的时候利用new 创建一个实例,这是一种主动的方法,但是对象之间相互依赖,导致我们在一个实例发生变化需要对依赖他的对象进行修改,这样对象之间的耦合性大大提高,因此可以通过工厂的方法+反射来解决这个问题。
如下图所示,我们将创建对象的权限交给工厂,这样能够大大减小程序之间的耦合。
Ioc实现的基本原理(模拟):
首先我们需要理解Bean的概念, Bean是对象的工厂,Bean在计算机英语中有可重用组件的意思,JavaBean是用Java语言编写的可重用组件,javabean就是所创建的实体类,它是用来创建我们service和到对象的。
创建需要两步:
第一:编写配置文件来配置我们的service和dao
配置内容:唯一标示=全限定性类名
第二:读取配置文件中的配置内容,反射创建对象
我的配置文件可以使xml,也可以是properties
创建具体流程bean:
- 1,工厂在静态方法区区读取XML的文件,利用getResourcesAsStream方法,可以搜索寻找文件,不用限定路径
- 2,利用一个HashMap保存key:id ,value:权限定类名
- 3,从工厂中利用getBean方法反射创建对象
- 4,最后,我们得出的是一个Object对象,需要利用接口进行强制转化。
具体代码如下所示:
public class BeanFactory {
private static Properties properties;
private static Map<String,Object> beans;
static{
//实例化对象
properties = new Properties();
//获取properties对象的流对象
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
try {
properties.load(in);
beans = new HashMap<String,Object>();
Enumeration keys = properties.keys();
while(keys.hasMoreElements()){
//获取每个key
String key = keys.nextElement().toString();
//根据key获去每个value
String Path = properties.getProperty(key);
//利用反射创建对象
Object value = Class.forName(Path).getDeclaredConstructor().newInstance();
//存入容器中
beans.put(key,value);
System.out.println(beans.get(key));
}
} catch (Exception e) {
System.out.println("获取实例化失败");
e.printStackTrace();
}
}
public static Object getBean(String beanName){
return beans.get(beanName);
}
}