Spring IOC AOP 原理简述

Spring IOC AOP 原理简述,第1张

什么是 IOC((Inversion of Control))?

所谓的 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、将对象中的属性注入

什么是 AOP?

Aspect Oriented Programming ,面向切面编程;

思考这样的应用场景:在以前的代码库中,功能已经写好了,但是此时需要对其中的类加上去某些功能,如果直接修改源代码的话,违反了开闭原则,直接继承下载,将扩展的代码写入进去的话,使得程序之间的耦合度度变高。

为了解决程序扩展,并且使得程序之间的耦合度尽可能的小一些,于是出现了 AOP 这种编程思想,在底层使用动态代理的方式,将原来的功能以及需要增加的功能叫给代理类来实现,使用代理类的实例实现相关的方法,这样一来,不仅满足了扩展功能的需要,而且使得程序之间的耦合度是比较小的;

实现 AOP 的核心就是如何创建代理对象,在 Spring 中使用 JDK 通过动态代理创建代理对象,还可以使用 CGLIB 创建代理对象;

小结

本文从解耦合的角度阐述了不同的解耦合方式、IOC 的基本概念,以及 Spring 创建管理对象的基本流程。简单了介绍了 AOP 的这种编程思想。

参考

IOC 图解 里面有几张容易理解的图

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/790903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存