所谓的 IOC 就是控制反转,控制反转就是开发者自己不创建对象,创建对象统一交给 Spring 等第三方框架进行管理;
正常的开发者创建对象的时候,是使用 new 关键词进行创建的,如下面所示:
class UserService {
public static void main(String[] args) {
UserDao userDao = new UserDao();
}
}
class UserDao {
}
上面这种开发是可以运行的,可以叫做“控制正转”,但是 UserService 与 UserDao 之间的耦合度太高了,
基于工厂模式的解耦合class UserService {
public static void main(String[] args) {
UserDao userDao = Factory.getUserDao();
}
}
class UserDao {
}
class Factory{
public static UserDao getUserDao() {
return new UserDao();
}
}
在上面的代码中,没有自己直接在 UserService 里面进行创建UserDao对象;而是在工厂中创建对象,然后被其他需要的类UserService进行调用即可。虽然在工厂模式下面的程序之间还是存在耦合度,但是相比较第一种,耦合度得到了一定的下降;
基于 Spring 的 IOC 再一次解耦合 - 控制反转在 Spring 的配置文件 xml 中需要填写相关的 bean 标签,这个标签指定了 创建对象的 id 以及类路径:
<bean id="userDao" class="com.luobin.springbootguli.UserDao"></bean>
// id 创建出来的对象的标识
// class 创建出来的具体对象的类路径,将来的类从这个类路径产生
在配置好了xml 文件之后,就可以解析 xml 文件,得到需要创建类的全限定名称 com.luobin.springbootguli.UserDao 在 Spring 中创建出来的容器中创建具体的 UserDao对象;
在 Spring 底层存在一个创建对象的工厂,读取 xml 配置文件,进行解析,得到类的全限定名称,反射创建对象,统一管理,再次降低耦合度。
Spring 创建对象的两种 IOC 容器(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用、在 ApplicationContext 这种 IOC 容器中读取 xml 文件的时候,一个是从磁盘的路径中读取,一个是在类路径中读取,两者之间有一定的区别。
上面的两种 IOC 容器 创建的对象的时机是不同的,一个是惰性创建,一个是在服务启动的时候就会创建对象
IOC 的 bean 管理在 IOC 容器中,主要做两件是:
1、创建对象
2、将对象中的属性注入
Aspect Oriented Programming ,面向切面编程;
思考这样的应用场景:在以前的代码库中,功能已经写好了,但是此时需要对其中的类加上去某些功能,如果直接修改源代码的话,违反了开闭原则,直接继承下载,将扩展的代码写入进去的话,使得程序之间的耦合度度变高。
为了解决程序扩展,并且使得程序之间的耦合度尽可能的小一些,于是出现了 AOP 这种编程思想,在底层使用动态代理的方式,将原来的功能以及需要增加的功能叫给代理类来实现,使用代理类的实例实现相关的方法,这样一来,不仅满足了扩展功能的需要,而且使得程序之间的耦合度是比较小的;
实现 AOP 的核心就是如何创建代理对象,在 Spring 中使用 JDK 通过动态代理创建代理对象,还可以使用 CGLIB 创建代理对象;
小结本文从解耦合的角度阐述了不同的解耦合方式、IOC 的基本概念,以及 Spring 创建管理对象的基本流程。简单了介绍了 AOP 的这种编程思想。
参考IOC 图解 里面有几张容易理解的图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)