IOC 即控制反转。将对象的控制权反过来交给spring进行管理。实现了对象与对象之间的解耦合。
什么是控制?控制权指的是类的对象的创建和使用的权利。 比如A类和B类,在A类中创建B类对象,并调用B类的方法,那么我们称A类有B类的控制权。
而控制反转即A类将创建的B的操作交给spring来做。A只需要向spring 获取B对象即可。
它的好处是,对象的构建如果依赖非常多的对象,且层次很深,外层在构造对象时很麻烦且不一定知道如何构建这么多层次的对象,IOC帮我们管理对象的创建,只需要在配置文件里指定如何创建,每一个对象的配置文件都在类编写的时候指定了,所以最外层对象不需要关心深层次对象如何创建的,前人都已经写好了;
例如:
定义一个接口ByeService,里面有一个bye方法,并创建两个实现类(中文和英文的),通过spring将对象注入UserAction类中;
我的目录为(仅供参考):
1、先写两个实现类;
ChineseService.java中的代码为: package before; public class ChineseService implements ByeService{ @Override public void sayBye(){ System.out.println("Today is 520 but I more like play code"); } }
EnglishService.java中的代码为: package before; public class EnglishService implements ByeService { @Override public void sayBye(){ System.out.println("今天是520,但是我更喜欢敲代码"); } }
2、定义一个接口ByeService,目的是让两个实现类去实现这个接口;
ByeService.java中的代码为: package before; public interface ByeService { void sayBye(); }
3、写一个spring配置文件applicationContext.xml;
applicationContext.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"> <bean class="before.ChineseService" id="chineseService"></bean> <bean class="before.EnglishService" id="englishService"></bean> <bean class="spring.UserAction" id="userAction"> <property name="byeService" ref="englishService"></property> </bean> </beans>
4、写一个UserAction去测试是否成功;
UserAction.java中的代码为: package spring; import before.ByeService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserAction { private ByeService byeService; public void bye(){ byeService.sayBye(); } public void setByeService(ByeService byeService){ this.byeService=byeService; } public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/applicationContext.xml"); UserAction userAction= (UserAction) applicationContext.getBean("userAction"); userAction.bye(); } }
测试结果为: