从上一节我们知道了Spring的两个核心部分:IOC(控制反转)和AOP(面向切面编程)。
下面我们开始讲述IOC这部分功能
IOC是什么?
翻译过来意思是“控制反转”,把对象的创建和对象间的调用通过Spring去管理,目的是为了降低程序的耦合度。
IOC的底层原理
在讲IOC底层原理实现之前,先思考一个问题:java中的对象间如何调用?
三种对象间调用的方式:
方案1:传统的java对象间的调用方式
在UserService类中实例化UserDao对象,然后调用UserDao中的方法
此方式耦合度较高,当UserDao方法发生变化,UserService中的代码也需要发生改变。
方案2:利用工厂模式解耦
创建一个工厂类,在工厂类中实例化UseDao对象,然后我们再UserService类中通过工厂类创建UserDao对象
此种方式的优点是,Service与Dao类进行了解耦,缺点是Service与工厂类UserFactory之间还是存在耦合度,如何最大限度的降
低耦合度呢?
方案3:Spring的IOC创建
IOC的底层实现利用3种JAVA技术
-
xml解析
-
工厂模式
-
反射
那么IOC是如何一步步降低你的程序耦合度的呢?我们要先了解IOC的过程:
1)创建xml配置文件,配置创建的对象,原先在代码里new 操作实例化对象现在通过Spring去管理
<bean id="userDao" class="org.learn.spring5.UserDao">
</bean>
2)创建工厂类,先利用xml解析技术对xml文件中class属性获取class值,然后利用反射机制创建对象
class UserFactory{
public static UserDao getUserDao(){
String classValue = class属性值;//利用xml解析xml文件中class属性获取class值org.learn.spring5.UserDao
Class clazz = Class.forName(classValue); //通过反射创建对象
return (UserDao)clazz.newInstance();
}
}
上面的例子就是Spring的IOC底层实现的基本原理,从上面程序可以看出利用Spring的IOC方式我们可以最大限度的降低了程序间的耦合度,对象的创建和对象间的调度都可以通过Spring去管理。
IOC接口的介绍
-
IOC思想基于IOC容器完成,IOC容器的底层就是对象工厂
-
IOC容器的实例化,Spring提供了两种方式:(两个接口)
1)BeanFactory
IOC容器的基本实现,是Spring内部的使用接口,不提供开发人员进行使用。
特点:加载配置文件时,不会创建对象,获取对象时才去创建对象。
BeanFactory beanFactory = new ClassPathXmlApplicationContext("bean1.xml"); //加载配置文件时,不去创建对象
User user = beanFactory.getBean("user",User.class); //此时才去创建对象
2)ApplicationContext
是BeanFactory的子接口,提供了更多更强大的功能,提供开发人员使用的。
特点:加载配置文件时,就会创建对象。
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");//加载配置文件时,创建对象
User user = context.getBean("user",User.class);
3. ApplicationContext的实现类介绍
FileSystemXmlApplicationContext:默认是从系统的盘符下获取文件
ClassPathXmlApplicationContext:默认是指项目的classpath路径下面的配置文件