大白话讲解IOC和AOP
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的更多相关文章
- spring的IOC和AOP协同工作
看网络上的spring资料,基本都是在讲解IOC和AOP,但是二者是如何协同工作的,说的很少. 粗略调试了下BeanFactory的创建过程,发现是如图所示的大概过程.其中BeanPostProces ...
- spring的IOC和AOP详细讲解
1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同时, ...
- spring的IOC和AOP
spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...
- BeanPostProcessor —— 连接Spring IOC和AOP的桥梁
之前都是从大Boss的视角,来介绍Spring,比如IOC.AOP. 今天换个视角,从一个小喽啰出发,来加深对Spring的理解. 这个小喽啰就是, BeanPostProcessor (下面简称 B ...
- Spring 的 IOC 和 AOP 的理解
Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...
- 我们到底为什么要用 IoC 和 AOP
作为一名 Java 开发,对 Spring 框架是再熟悉不过的了.Spring 支持的控制反转(Inversion of Control,缩写为IoC)和面向切面编程(Aspect-oriented ...
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
- spring - ioc和aop
1.程序中为什么会用到spring的ioc和aop 2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题 3.原理 关于1: a:我们平常使用对象的时候,一般都是直接使用关键字类new ...
- Castle框架中的IOC和AOP机制
反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...
随机推荐
- Django_视图中的request对象详解(八)
本文参考:http://www.cnblogs.com/MnCu8261/p/5871085.html Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并 ...
- [ SQLAlchemy ] 自我引用型的多对多关系(Self-Referential Many-to-Many Relationship)理解
参考: https://www.jianshu.com/p/2c6c76f94b88 https://madmalls.com/blog/post/followers-and-followeds/ 实 ...
- Linux命令--ss命令的参数及使用详解
ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...
- linux .gz文件 压缩与解压缩命令
1. 压缩文件 gzip 源文件 如压缩 b.txt 使用命令 gzip b.txt 注意 压缩为 .gz 文件 源文件会消失 如果想保留源文件 使用命令 gzip -c 源文件 > 压缩文件 ...
- Java 在PDF中添加工具提示|ToolTip
本文,将介绍如何通过Java后端程序代码在PDF中创建工具提示.添加工具提示后,当鼠标悬停在页面上的元素时,将显示工具提示内容. 导入jar包 本次程序中使用的是 Free Spire.PDF for ...
- python实现掘金定时签到抽奖
python实现掘金定时签到抽奖 一. 概述 这里记录一下使用 python 实现掘金定时签到抽奖.首先需要登录掘金,进入签到页面,按 F12 打开浏览器的调试面板,选择 Network,选择 XHR ...
- JS里默认和常用转换
* { font-family: PingFang, Monaco } JS里的六大简单数据类型 string 字符类型 number 数字类型 boolean 布尔类型 symbol ES6语法新增 ...
- 【Java常用类】两个Date类
两个Date类 java.util.Date类 两个构造器的使用 构造器一:Date():创建一个对应当前时间的Date对象 构造器二:创建指定毫秒数的Date对象 两个方法的使用 toString( ...
- leetcode 509. 斐波那契数
问题描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...
- 《手把手教你》系列技巧篇(五十八)-java+ selenium自动化测试-分页测试(详细教程)
1.简介 前几天,有人私信里留言问宏哥,分页怎么自动化测试了,完了给他说了说思路,不知道最后搞定没有,索性宏哥就写一篇文章来讲解和介绍如何处理分页. 2.测试场景 对分页来说,我们最感兴趣的和测试的无 ...