IOC
什么是IOC?IOC(Inverse of Control) 控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。将对象的创建权力反转给Spring框架!
在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类出了问题,那么可能会导致这个框架出现问题。 Spring 将创建对象的权利给了IOC,在IOC当中创建了ABC三个对象吗,那么我们我们其他的类只需要调用集合, 大大的解决了程序耦合性的问题。
IOC解决什么问题?使用IOC可以解决程序耦合性高的问题。
IOC容器的底层原理
IOC的实现,依赖于以下3门技术
- dom4j解析xml文档;
- 工厂模式;
- 采用反射设计模式创建对象
DOM4J:是一个开源的,基于Java的库来解析XML文档,它具有高度的灵活性,高性能和内存效率的API。由电脑完成。
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
采用反射设计模式创建对象:Class.newInstance() 或Constructor.newInstance()
Spring实现IOC
public class Demo { public void hello() { System.out.println("hello world"); } }
1.xml配置文件,配置创建对象
<bean id="demo" class="com.qcby.Demo" />
2.创建工厂类
public class DemoFactory { //利用dom4j得到name所对应的value值 public static Demo getDemo() throws Exception { //利用dom4j得到name所对应的value值 String value="class路径";//demo在项目中的路径 //通过反射创建对象 Class clazz = Class.forName(value); //返回并创建demo对象 return (Demo) clazz.newInstance(); } }
通过以上两步,我们基本上就可以得到我们所创建的对象。
IOC(接口)
创建maven项目,在scr\main\java中创建com.qcby.Demo类
public class Demo { public void hello() { System.out.println("hello world"); } }
在scr\main\resources中配置SpringConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--IOC管理bean--> <!--id:类的唯一标识符 class:类的全路径名--> <bean id="demo" class="com.qcby.Demo" ></bean> </beans>
IOC思想是基于IOC容器完成的,IOC的底层就是对象工厂。
Spring里边提供了IOC容器的实现的两种方式:
- BeanFactroy:IOC容器是Spring内部的使用接口,不提供给开发人员使用
public class DemoTest { //传统写法 @Test public void run(){ Demo demo = new Demo(); demo.hello(); } //spring写法 @Test public void run1(){ //创建spring工厂,加载配置文件 BeanFactory ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取bean对象 Demo demo = (Demo) ac.getBean("demo"); demo.hello(); } }
【注意】 BeanFactroy:加载配置文件的时候不会去创建对象,在使用对象的时候才会去创建对象
ApplicationContext:BeanFactory接口的子接口,提供了更多更强大的功能,一般由开发人员进行使用
public class DemoTest { //传统写法 @Test public void run(){ Demo demo = new Demo(); demo.hello(); } //spring写法 @Test public void run1(){ //创建spring工厂,加载配置文件 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取bean对象 Demo demo = (Demo) ac.getBean("demo"); demo.hello(); } }
【注意】加载配置文件的时候会把对象创建