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. Flask_Flask-Script脚本扩展的使用(八)

    Flask-Script扩展包提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行 ...

  2. PowerShell【IF篇】

    1 [int]$num=0 2 do 3 { 4 $num+=1 5 if($num%2) 6 { 7 "$num"+" 是奇数" 8 }else{ 9 &qu ...

  3. 怎样在 CentOS/RHEL 7/6 上安装和配置 Sendmail 服务器

    在 CentOS 上,可以通过 mailx 命令 或 sendmail 命令来给因特网发送电子邮件. 关于前者的文章比较多,关于后者的文章比较少. 这里记录了我在 CentOS 7 上安装和配置 se ...

  4. ch01系统基础信息模块详解

    第1章 系统基础信息模块详解 1.1 系统性能信息模块 psutil 解决VMWare在Windows10的安装问题: 安装VC Redistributable 2017 解决虚拟机的上网问题:修改V ...

  5. 使用结构化克隆在 JavaScript 中进行深度复制

    在很长一段时间内,您不得不求助于变通方法和库来创建 JavaScript 值的深层副本.现在js提供 「structuredClone()」 一个用于深度复制的内置函数. 浏览器支持: 浅拷贝 在 J ...

  6. 开源数据可视化BI工具SuperSet(安装)

    本次安装教程共分两大步骤,因为Superset 基于python3编写的web应用(flask) 所以要求python3环境,故首先要将linux系统自带的环境进行升级,已经是python3的可跳过- ...

  7. Docsify部署IIS

    什么是Docsify? 一个神奇的文档网站生成器.docsify 可以快速帮你生成文档网站.不同于 GitBook.Hexo 的地方是它不会生成静态的 .html 文件,所有转换工作都是在运行时.如果 ...

  8. 【刷题-LeetCode】238. Product of Array Except Self

    Product of Array Except Self Given an array nums of n integers where n > 1, return an array outpu ...

  9. 【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found -- The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

    问题描述 使用NodeJS的后端应用,开发一个Mobile App的服务端,手机端通过REST API来访问获取后端数据.在本地编译好后,通过npm start启动项目,访问效果如下: 但是,当把项目 ...

  10. Tomcat访问项目出现HTTP状态404-未找到,类型 状态报告 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。Apache Tomcat/9.0.40

    错误提示如图,无任何消息提示,控制台也没有错误. 解决方法: IDEA,上方菜单栏点击Run–>Edit Configurations-,选择Deployment,将Application co ...