IOC:inversion of controller 控制反转
1、IOC 控制反转 即把创建对象权反转给工厂
控制反转:将原先代码需要实现的对象创建、依赖的代码反转给容器(即工厂)来帮忙实现,从而实现解耦
2、Spring容器怎么创建对象?
工厂来创建对象(xml配置文件+反射的方式)
面试题: IOC 和 DI的区别?
IoC 控制反转:指将对象的创建权,反转到Spring容器 ,
DI 依赖注入:指Spring创建Bean对象的过程中,将对象依赖属性通过配置注入到bean组件
IOC的底层原理:
通过工厂+配置文件+反射,来得到java bean对象。
即在工厂类里,读取spring配置文件,获取class属性的值,拿到类名通过反射得到javabean对象
示例代码:
public class BeanFactory {
private static Document document = null;
static {
try {
// 创建解析器对象
SAXReader reader = new SAXReader();
// 将配置文件以流的形式加载成输入流对象
InputStream resourceAsStream = BeanFactory.class.getClassLoader().getResourceAsStream("applicationContext.xml");
// 将输入流对象读到解析器
document = reader.read(resourceAsStream);
} catch (DocumentException e) {
e.printStackTrace();
}
}
// 创建一个返回bean对象的方法
public static<T> T getBean(String idValue){
try {
//得到根对象
Element rootElement = document.getRootElement();
// 通过xpath语法,根据id属性的值,得到bean标签对象
Element beanTage = (Element)rootElement.selectSingleNode("//bean[@id='" + idValue + "']");
// 通过key-value形式在配置文件获取类路径
String className = beanTage.attributeValue("class");
// 通过类路径获取类的字节码
Class<T> className= ( Class<T>)Class.forName(className);
// 通过字节码生成类的实例对象
T t= className.newInstance();
return t;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
DI有两种方式向Bean对象注入依赖
1、通过set方法注入属性,进行赋值
2、通过有参构造的方式,进行赋值