大白话讲解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平台下实现这两项技术没有形成可以广泛套用的框架 ...
随机推荐
- python 使用exec执行定义好的方法,提示“name 'XXX' is not defined”
文件A中的exec(),调到了文件B中的方法,提示name is not defined exec()调用时,提示方法没有定义 试过了的方法: 1.百度上说是局部变量或者是全局变量之间的文件,然后在e ...
- python 面向对象:多态和多态性
很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗. 一.多态 多态指的是一类事物有多种形态.(一个抽象类有多个子类,因而多态的概念依赖于继承) 比如动物有多种形态:人 ...
- java 使用 ArrayList 排序【包括数字和字符串】
1.数字排序 /** * 数字排序 */ @Test public void t2() { List<Integer> list = new ArrayList<>(); li ...
- 论文翻译:2021_AEC IN A NETSHELL: ON TARGET AND TOPOLOGY CHOICES FOR FCRN ACOUSTIC ECHO CANCELLATION
论文地址:https://ieeexploreieee.53yu.com/abstract/document/9414715 Netshell 中的 AEC:关于 FCRN 声学回声消除的目标和拓扑选 ...
- 只需两步在Linux系统安装百度网盘--Ubuntu20
Linux Ubuntu系统安装百度网盘 百度网盘已支持Linux系统下载和使用.使用Linux系统下载并安装一个百度网盘是非常简单的,只需要以下两个步骤: 第一步 进入官网下载.deb类型的百度网盘 ...
- php反序列化之pop链构造
本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...
- mysql之突破secure_file_priv写webshell
在某些情况下,当我们进入了一个网站的phpMyAdmin时,想通过select into outfile来写shell,但是通常都会报错. 这是因为在mysql 5.6.34版本以后 secure_f ...
- 智能集成接口:I3 ISA-95 的应用
介绍 多年来,使用基于制造运营管理 (MOM) 的应用程序的制造 IT 顾问试图说服制造商这些类型的应用的高价值.实时 MOM 解决方案是唯一一组能够精确优化工厂日常运营的 IT 应用程序,可为其可用 ...
- FastDFS文件的上传和下载
一.FastDFS概述: FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.下载)等,解决了大容量存储和负载均衡的问题,高度追求高性能 ...
- python2.7发送邮件失败之——代码问题
使用python2.7发送邮件,代码如下: from email.header import Headerfrom email.mime.text import MIMETextimport smtp ...