前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring全家桶之Spring核心篇,深度分析IoC以及AOP

Spring全家桶之Spring核心篇,深度分析IoC以及AOP

原创
作者头像
Java学术趴
发布于 2022-05-06 14:09:11
发布于 2022-05-06 14:09:11
59700
代码可运行
举报
文章被收录于专栏:Java全栈·Java全栈·
运行总次数:0
代码可运行

👨‍🎓作者:Java学术趴 🏦仓库:Github、Gitee ✏️博客:CSDN、掘金InfoQ、云+ 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。

👋大家好!我是你们的老朋友Java学术趴。最近小编又在整了Spring全家桶笔记,笔记会每天定时的进行发放。小编会每天分享的呦。Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。

第一章 IoC控制反转

1.1 控制反转的概念
  • 控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对 象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值, 依赖的管理。
  • 控制: 创建对象,对象的属性值赋值,对象之间的关系管理。
  • 反转: 把原来的开发人员管理,创建对象的权限转移交给代码之外的容器实现。由容器代替开发人员管理对象。创建对象,给属性赋值。
  • 正转: 把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现。由容器代替开发人员管理对象,创建对象,给属性赋值。
  • 容器: 是一个服务软件,一个框架(Spring)
  • Ioc 的实现
代码语言:txt
AI代码解释
复制
- 依赖查找:DL( Dependency Lookup ),容器提供回调接口和上下文环境给组件。
- 依赖注入:DI(Dependency Injection),程序代码不做定位查询,这些工作由容器自行完成。**Spring 框架使用依赖注入(DI)实现 IoC。**

Java中创建对象的方式

  • 构造方法,new Student()
  • 反射 :Class
  • 序列化 :数据库
  • 克隆 : Clone
  • 动态代理 :AOP
  • IoC : 控制反转

IoC的体现

之前学习到的应用控制反转的实例:Servlet对象的创建管理,这一工作完全交给了Web容器。

Tomcat就是一个容器:里面存放有Servlet对象、Listener对象、Filter对象等。

IoC的技术实现

  • DI是IoC的技术实现,DI(Dependency Injection) : 依赖注入,只需要在程序中提供要使用的对象名就可以,至于对象如何在容器中创建、赋值、查找都由容器内部实现。
  • Spring是使用DI实现了IoC的功能,Spring底层创建对象,是使用的反射机制

第三章 AOP 面向切面编程

3.1 动态代理

动态代理的分类

  • jdk动态代理:使用jdk中的Proxy、Method、InvocationHanderl创建代理对象。jdk动态代理要求目标类必须实现接口。要求:目标类中必须实现接口
  • cglib动态代理:第三方工具,创建代理对象,原理是继承。通过继承目标类,创建子类,子类就是代理对象。要求:目标类必须能够继承,目标类不能是final的,方法也不能是final的。其子类就是代理对象。

动态代理的作用:

  • 在目标类源代码不改变的情况下,增加新的功能(即方法)
  • 减少代码的重复
  • 专注业务逻辑代码
  • 解耦合,让你的业务红能和日志,事务与非事务功能分离

3.2 AOP面向切面编程

  • AOP就是基于动态代理的,可以使用jdk、cglib两种代理模式。AOP就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一的方式,使用动态代理。它的功能和动态代理是一样的。

AOP(Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程序运行过程。

AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB 的动态代理。

所谓的切面:就是给目标类增加的额外的功能。

切面的特点:一般都是与业务无关的功能,并且这个功能可以独立使用。

精准概念:

  • AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,可通过运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 Spring 框架中的一个重要内容。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程 序的可重用性,同时提高了开发的效率。

怎么理解面向切面编程

  • 需要在分析项目功能时,找出切面(重点)
  • 合理的安排切面的执行时间(在目标放前,还是目标方法之后。)
  • 合理的安排切面执行的位置,在哪个类,哪个方法中增加切面。

针对AOP切面编程的分析

  • 面向切面编程,就是将交叉业务逻辑封装成切面,利用 AOP 容器的功能将切面织入到 主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、 事务、日志、缓存等。 若不使用 AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样, 会使主业务逻辑变的混杂不清。
  • 例如,转账,在真正转账业务逻辑前后,需要权限控制、日志记录、加载事务、结束事 务等交叉业务逻辑,而这些业务逻辑与主业务逻辑间并无直接关系。但,它们的代码量所占 比重能达到总代码量的一半甚至还多。它们的存在,不仅产生了大量的“冗余”代码,还大 大干扰了主业务逻辑---转账。

面向切面编程有什么好处

  • 减少重复代码的书写
  • 专业业务的开发

注意:面向切面编程只是面向对象的一种补充。

使用AOP减少重复代码,专注业务实现

3.3 AOP编程术语(重点)

3.3.1 切面(Aspect)
  • 切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面 是通知(Advice)。实际就是对主业务逻辑的一种增强。切面就是表示功能的增强,就是一堆实现某个功能的代码,并且这个功能与业务没有关系。可以独立运行,时独立于业务存在的一段功能代码。常见的切面:日志、事务、统计信息、参数检查、权限验证等。
3.3.2 连接点(JoinPoint)
  • 连接点指可以被切面织入的具体方法,通常业务接口中的方法均为连接点。连接业务方法和切面的位置,就是某个业务接口中的业务方法。
3.3.3 切入点(Pointcut)
  • 切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。

注意:被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不 能被增强的。

3.3.4 目标对象(Target)
  • 目 标 对 象 指 将 要 被 增 强 的 对 象 。 即 包 含 主 业 务 逻 辑 的 类 的 对 象 。 上 例 中 的 StudentServiceImpl 的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然, 不被增强,也就无所谓目标不目标了。
3.3.5 通知(Advice)
  • 通知表示切面的执行时间,Advice 也叫增强。上例中的 MyInvocationHandler 就可以理 解为是一种通知。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是目标方 法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。

切入点定义切入的位置,通知定义切入的时间。

3.4 AOP实现框架

3.4.1 一个切面的三个关键要素
  • 切面的功能代码:代表切面干什么了
  • 切面的执行位置 ,使用Pointcut表示切面执行的位置
  • 切面的执行时间,使用Advice表示时间,在目标放之前,还是在目标方法之后。
3.4.2 AOP技术的实现

AOP是一个规范,是动态代理的一个规范化,一个标准。

AOP的技术实现框架的技术(两种)

  • spring : spring在内部实现了aop规范,可以完成aop的工作。spring主要在事务处理的时候使用aop。在实际开发中,很少使用spring的aop实现。因为spring的aop比较笨重。
  • aspectJ : 一个开源的专门用来做aop的框架。spring框架中继承了aspectJ 框架,通过spring就可以使用aspectJ框架的功能。

3.5 AspectJ 框架

3.5.1 AspectJ介绍
  • 对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向 切面编程。然而,AspectJ 也实现了 AOP 的功能,且其实现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框 架中。

在 Spring 中使用 AOP 开发时,一般使用 AspectJ 的实现方式。

  • AspectJ 是一个优秀面向切面的框架,它扩展了 Java 语言,提供了强大的切面实现。AspectJ 是Eclipse基金会的一个开源项目
  • a seamless aspect-oriented extension to the Javatm programming language(一种基于 Java 平台 的面向切面编程的语言)
  • Java platform compatible(兼容 Java 平台,可以无缝扩展)
  • easy to learn and use(易学易用)
3.5.2 AspectJ实现aop的两种方式
  • 使用xml的配置文件:配置全局事务
  • 使用注解,实际开发中用到的就是注解的方式。aspectJ有5个注解。
3.5.3 AspectJ框架的使用方式
  • 切面的执行时间:这个执行时间在规范中叫做Advice(通知、增强)。在aspectJ框架中使用注解表示。也可以使用xml配置文件中的标签表示。
代码语言:txt
AI代码解释
复制
- @Before (前置通知)
- @AfterReturning (后置通知)
- @Around (环绕通知)
- @AfterThrowing (异常通知)
- @After (最终通知)

以上的五个注解都是表示切面执行的时间。

  • 切面的执行位置: 使用切入点表达式
3.5.4 AspectJ的通知类型(了解)

AspectJ中常用的五种类型:

  • 前置通知 (@Before)
  • 后置通知 (@AfterReturning)
  • 环绕通知 (@Around)
  • 异常通知 (@AfterThrowing)
  • 最终通知 (@After)
3.5.5 切入点表达式语法(指定切入点的位置)

AspectJ 定义了专门的表达式用于指定切入点。表达式的原型是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 参数之间使用空格分开
execution(modifiers-pattern? ret-type-pattern 
declaring-type-pattern?name-pattern(param-pattern)
throws-pattern?)

// 以上的4个部分,注意这个参数只写参数的类型吗,而不写参数的形参值。
execution(访问权限 方法返回值 包名.类名.方法名称(方法的参数类型) 异常类型)
复制代码

解释AspectJ参数信息

  • modifiers-pattern :访问权限类型
  • ret-type-pattern : 返回值类型
  • declaring-type-pattern :包名类名
  • name-pattern(param-pattern) : 方法名(参数类型和参数个数)
  • throws-pattern : 抛出异常类型

注意:? 代表可选的部分。也就是上面没有标粗的参数。

切入点表达式要匹配的对象就是目标方法的方法名。所以,execution 表达式中明显就 是方法的签名。

3.5.6 切入点表达式使用同配符

在AspectJ可以使用通配符的目的 :为了可以在配置文件中使用一个注解来获取到多个目标对象,然后给这些目标对象添加统一的功能或者补充其他的功能。

举列说明:(只有返回值类型以及方法名(参数)这两个参数不可以省略,所在在简化的切点表达中肯定存在这两个参数的信息)

  • *execution(public * (..)) : 指定切入点的位置,任意公共的方法。
  • execution( set(...)) :** 指定切入点的位置,任意一个以 "set" 开始的方法。
  • execution( com.yunbocheng.service. .*(..)) :** 指定切入点的位置是service包中的任意类中的任意方法。
  • execution( com.yunbocheng.service.. .(..)):** 指定切入点的位置是 service包或者子包中的任意类的任意方法。".."出现在类名中时,后面必须跟"",表示包、子包下的所有类。
  • execution( ..service. * .(..)):* 指定切入点的位置是:多级包下的service子包下所有类(接口)中所有方法为切入点。
  • execution( .service. * .(..)):* 指定切入点的位置是:一级包下的service子包下所有类(接口)中所有方法为切入点。
  • execution( joke(String,)) :** 指定所有的包中的 joke() 方法,该方法的第一个参数为String,第二个参数可以是任意类型。如:joke(String s1,String s2) 、joke(String s1,double d)
  • execution( joke(String,..)):* 所有的 joke()方法,该方法第一个参数为 String,后面可以有任意个参数且 参数类型不限,如 joke(String s1)、joke(String s1,String s2)和 joke(String s1,double d2,String s3) 都是。

今天就先分享到这里啦,明天小编继续给大家分享Spring全家桶笔记!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
来谈谈 Spring Framework 的 IoC 与 AOP
IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。
用户1516716
2019/09/24
4830
来谈谈 Spring Framework 的 IoC 与 AOP
Spring AOP和IOC
Spring的核心机制是依赖注入(Dependency Inversion),也称为控制反转(IOC)。所谓依赖注入,就是指运行工程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖外部的注入。
week
2018/08/27
2540
探究 Spring Boot 的核心:IOC 和 AOP
Spring Boot 作为一种简化 Spring 应用开发的工具,继承了 Spring 框架的核心概念,其中最重要的是控制反转(IOC)和面向切面编程(AOP)。它们是 Spring 框架的基础,同时也深深植根于 Spring Boot 中。本文将讨论 IOC 和 AOP 的概念以及它们在 Spring Boot 中的应用。
小马哥学JAVA
2024/02/23
8320
深入解析Spring的IOC与AOP及其在项目中的应用
在现代的软件开发中,为了提高代码的可维护性、可扩展性以及降低代码的耦合度,使用设计模式和面向切面编程(AOP)成为了程序员们常用的技术手段。Spring作为一个优秀的Java开发框架,提供了IOC和AOP两个核心特性,极大地简化了开发工作。本文将深入探讨Spring的IOC和AOP的概念、原理以及它们在项目中的应用。
疯狂的KK
2023/08/14
9820
深入解析Spring的IOC与AOP及其在项目中的应用
Spring AOP(一) AOP基本概念
AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清楚的同学可以自行去了解。
宁在春
2022/10/31
3270
Spring AOP(一) AOP基本概念
SpringBoot的AOP实战
切入点表达式格式:execution(访问权限 方法返回值 方法声明(参数) 异常类型)
十玖八柒
2022/08/01
4460
SpringBoot的AOP实战
Spring AOP(一) AOP基本概念
 Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。
程序员历小冰
2019/02/11
4810
Spring AOP(一) AOP基本概念
SpringAOP原理分析
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
崔笑颜
2020/06/08
4930
一篇带你进入Spring的世界
我们上学期开了一门网络编程课,讲了servlet+jsp,不过那个老师就喜欢扯东扯西的讲一大堆无关紧要的东西,好家伙重点全跳过,我就索性就没听过了。所以jsp学的不好的同学无所谓,不过建议Servlet学习透彻些,毕竟现在的Java WEB都还是围绕着Servlet的,这些框架也都是封装的Servlet。
东边的大西瓜
2022/05/05
2760
一篇带你进入Spring的世界
Spring笔记
它是一个容器.它是整合其它框架的框架.它的核心是IOC和AOP.它由20多个模块构成.它在很多领域都提供优秀的解决方案.
Eternity
2022/08/24
6570
Spring的核心特性
众所周知,Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-OrientedProgramming),即“面向切面编程”。
赵哥窟
2019/02/25
1.7K0
Spring的核心特性
系统学习SpringFramework:Spring AOP
AOP(Aspect oriented programming),即面向切面编程,它是一个编程范式,是 OOP(面向对象编程)的一种延续,目的就是提高代码的模块性。
栗筝i
2022/12/01
2740
Spring Aop相关详解
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转。 举例来说,在之前的操作中,比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建类的对象,使用对象调用方法实现。对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的。 AOP:面向切面编程。
Dream城堡
2020/11/11
3200
AOP面向切面编程
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,
木瓜煲鸡脚
2019/10/10
1.2K0
AOP面向切面编程
Spring Aop 扫盲
面向切面编程(Aspect-oriented Programming,俗称AOP)提供了一种面向对象编程(Object-oriented Programming,俗称OOP)的补充,面向对象编程最核心的单元是类(class),然而面向切面编程最核心的单元是切面(Aspects)。与面向对象的顺序流程不同,AOP采用的是横向切面的方式,注入与主业务流程无关的功能,例如事务管理和日志管理。
cxuan
2019/09/09
6610
Spring Aop 扫盲
Spring之AOP详解
AOP介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。 面向切面是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。常见的使用场景: i :日志 ii: 事务 iii:数据库操作 … 面向切面编程的几个核心概念 概念 说明 IOC/DI 本质是就是Java反射+XML解析 AOP 本质上Java动态代理 切点 要添加代码的地
用户4919348
2019/04/02
4030
Spring之AOP详解
面试之Spring AOP和IOC
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
Java技术债务
2022/08/09
3850
面试之Spring AOP和IOC
Java学习笔记-全栈-web开发-14-Spring入门&AOP编程&Spring注解开发&Spring事务
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。 Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益
devi
2021/08/18
3960
Java学习笔记-全栈-web开发-14-Spring入门&AOP编程&Spring注解开发&Spring事务
浅识Spring AOP
就是从每个核心方法中抽取出来的非核心代码(既非核心业务逻辑),最后放入一个类中(这个类叫切面),不同的业务逻辑实现不同的方法
用户11097514
2024/05/30
1210
Spring源码阅读系列之一:Spring AOP原理(上)
本文是Spring原理分析的第一篇博文,主要阐述Spring AOP相关概念,同时从源码层面分析AOP实现原理。对于AOP原理的理解有利于加深对Spring框架的深入理解。同时我也希望可以探究Spring框架在处理AOP的解决思路,学习框架的时候,有时候需要站在设计者的角度上去考虑,如果自己是设计者遇到同样需要解决的问题自己会怎么去处理,然后再对照实际框架中的处理方式,这样可以发现自己考虑不足之处。 本文侧重于找到Spring框架处理AOP的起点,至于涉及到的动态代理相关的问题将在下一篇文中着重介绍。
慕枫技术笔记
2023/03/20
2610
Spring源码阅读系列之一:Spring AOP原理(上)
相关推荐
来谈谈 Spring Framework 的 IoC 与 AOP
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验