IOC和AOP

什么是IOC

IoC(Inversion of control)控制反转,它是一种思想,而Spring Framework实现了这一思想。Ioc也称为依赖注入(DI)。

IOC控制反转,即将new 对象的权利交给Spring容器。

将创建对象的控制权交给Spring容器有什么好处呢?

想象这样一个场景,我们要创建一个对象,这个对象可能依赖一个或多个其他对象,就像我们创建下面这个对象的样子。

@Controller
public class TestService {
@Autowired
private TestOneDao testOneDao;
@Autowired
private TestTwoDao testTwoDao;
}

我们要知道,我们依赖的对象,也可能会依赖其他的对象。这是一个嵌套的过程。要是这些依赖关系都由我们来管理,想想都崩溃吧。所以索性让Spring容器来管理这些依赖关系,也就是自动帮我们注入这些依赖。这样子我们要使用某一个对象的时候,直接向IoC容器拿就可以了。

所以现在就比较好理解控制反转

控制:指对象创建的权利

反转:将控制权交给IOC容器

IoC容器和工厂模式有什么关系呢?

IoC中最基本的技术就是“反射”编程,通俗的讲就是根据给出的类名(字符串形式)来动态地生成对象

我们可以把IoC容器看做是一个工厂,我们需要什么对象,直接向工厂拿就行了,一般的工产模式只能生产某一类商品,但是IoC容器它能生产不同类型的商品,之所以能做到这一点,是因为它比一般工厂模式多使用了反射机制。

还记得我们刚学spring的时候吗,那时候需要配置类的全限定类名。如下

<?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 id="..." class="..."> (1) (2)
<!-- collaborators and configuration for this bean go here -->
</bean> <bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean> <!-- more bean definitions go here --> </beans>

这个全限定类名(class后面跟着的)就是反射生产对象所需的。

什么是AOP?

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(百度百科)

上面的不是很好理解,举一个有关事务的例子。

大家学习Spring的时候,可能会接触过编程式事务管理声明式事务管理

编程式事务管理:简单的理解就是自己编写事务逻辑

声明式事务管理:一个注解就搞定了,底层就是通过AOP实现的。

虽然声明式事务管理是通过AOP来实现的,但是想要理解AOP的原理,还得从编程式事务管理开始。

伪代码如下(把我们的业务代码包裹在事务中)

事务开始
业务代码
事务提交

真正代码

@Autowired
private TransactionTemplate transactionTemplate;
public void test() { transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { // .... 业务代码
} catch (Exception e){
//回滚
transactionStatus.setRollbackOnly();
} }
});
}

编程式事务管理存在什么问题呢?

如果我们有另一个业务代码需要进行事务控制,那我们就需要重复编写上面的事务逻辑代码。导致代码重复量大,于是人们提出了AOP面向切面编程。

AOP,在不改变我们原有代码的前提下,将代码加强(增加事务)。

那AOP是如何不改变原有代码,使得业务代码加强的呢?其实是基于代理模式。

如果不懂代理模式的可以看一下尚**的视频,直达代理模式:https://www.bilibili.com/video/BV1G4411c7N4?p=94

下面进行模拟

目标:我们要增强Student的learn()方法(比如添加事务、日志、安全等)

public class Student {
public void learn(long ms) {
System.out.println("student is learning!");
}
}
public class ProxyFactory implements MethodInterceptor {
//代理的对象
private Object target; //我们要代理的对象是哪一个就传进来哪一个(这里传进来的是Student)
public ProxyFactory(Object target) {
this.target = target;
} //这个方法看不懂也没有关系,只需要知道它返回了一个代理对象(也就是target的代理对象,这里是Student的代理对象)
public Object getProxyInstance() {
//1. 实例化工具类
Enhancer en = new Enhancer();
//2. 设置父类
en.setSuperclass(this.target.getClass());
//3. 设置回调函数
en.setCallback(this);
//4. 创建子类,也就是代理对象
return en.create();
} public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("事务开始");
long begin = System.currentTimeMillis();
//执行目标对象的方法
Object returnVal = method.invoke(target, objects);
System.out.println("事务结束");
return returnVal;
} }
public static void main() {
ProxyFactory proxyFactory = new ProxyFactory(new Plane());
Student student = (Student) proxyFactory.getProxyInstance();
student.learn();
}

最终输出

事务开始
student is learning!
事务结束

参考:

中文官网:https://www.docs4dev.com/docs/zh/spring-framework/5.1.3.RELEASE/reference/core.html

IoC实现原理:https://blog.csdn.net/fuzhongmin05/article/details/61614873

依赖注入:https://blog.csdn.net/xzp_12345/article/details/77885614

有帮助的话,动个小指点个赞吧,欢迎关注我的公众号玩编程地码农,目前在写数据结构与算法、计算机基础、java相关的知识。

大白话讲解IOC和AOP的更多相关文章

  1. spring的IOC和AOP协同工作

    看网络上的spring资料,基本都是在讲解IOC和AOP,但是二者是如何协同工作的,说的很少. 粗略调试了下BeanFactory的创建过程,发现是如图所示的大概过程.其中BeanPostProces ...

  2. spring的IOC和AOP详细讲解

    1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同时, ...

  3. spring的IOC和AOP

     spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...

  4. BeanPostProcessor —— 连接Spring IOC和AOP的桥梁

    之前都是从大Boss的视角,来介绍Spring,比如IOC.AOP. 今天换个视角,从一个小喽啰出发,来加深对Spring的理解. 这个小喽啰就是, BeanPostProcessor (下面简称 B ...

  5. Spring 的 IOC 和 AOP 的理解

    Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...

  6. 我们到底为什么要用 IoC 和 AOP

    作为一名 Java 开发,对 Spring 框架是再熟悉不过的了.Spring 支持的控制反转(Inversion of Control,缩写为IoC)和面向切面编程(Aspect-oriented ...

  7. Spring的IOC和AOP之深剖

    今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...

  8. spring - ioc和aop

    1.程序中为什么会用到spring的ioc和aop 2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题 3.原理 关于1: a:我们平常使用对象的时候,一般都是直接使用关键字类new ...

  9. Castle框架中的IOC和AOP机制

    反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...

随机推荐

  1. 欢迎收看 Flink Forward Asia 2021 峰会直播

    在线收看地址:https://developer.aliyun.com/special/ffa2021/live#?utm_content=g_1000316459 Flink 是由 Apache 软 ...

  2. 强化学习实战 | 自定义gym环境之显示字符串

    如果想用强化学习去实现扫雷.2048这种带有数字提示信息的游戏,自然是希望自定义 gym 环境时能把字符显示出来.上网查了很久,没有找到gym自带的图形工具Viewer可以显示字符串的信息,反而是通过 ...

  3. Flowable实战(一)启动第一个完整流程

    一.前言:   发现网上关于Flowable的资料基本都是浅尝辄止,对如何构建一个企业级的流程应用说明很少,所以写个实战系列,希望对大家和自己,都有所帮助. 二.认识Flowable   Flowab ...

  4. 《剑指offer》面试题32 - III. 从上到下打印二叉树 III

    问题描述 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20, ...

  5. [Windows]为windows系统鼠标右键添加软件和图标

    转载自 https://blog.csdn.net/p312011150/article/details/81207059 一.打开注册表 首先打开windows的注册表,当然了,我个人倾向于 (1) ...

  6. NTT 快速数论变换

    NTT 先学习FFT 由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换). 建议先完全理解FFT后再学习NTT. 原根 NTT使用与单位根性质相似的原根来代替单位根. ...

  7. golang中的runtime包

    1. runtime.Gosched  让出CPU时间片,重新等待安排任务 package main import ( "fmt" "runtime" ) fu ...

  8. http8种请求方式

    根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELE ...

  9. CNN-卷积神经网络简单入门(1)

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习 ...

  10. https的页面内嵌入http页面报错的问题

    1.https的页面内嵌入http页面报错 在HTTPS的页面上嵌入http的页面时,浏览器会直接报错.比如在HTTPS页面上用 iframe 直接嵌入一个 http 页面,比如我们可以在百度上直接嵌 ...