Spring AOP理解

参考链接

AOP简介

AOP(面向切面编程),可以说时OOP的补充,使用OOP时,我们在日常编写代码的时候,一旦牵涉到大型一点的项目,项目不可或缺的事务处理,安全处理,验证处理。。。等等大量与我们业务核心逻辑无关的但是又需要的代码这里称之为——共生代码,这个时候单纯使用OOP已经开始有点力不从心了,更何况我们项目日后还要升级、扩展,在源码上扩展大量代码也不现实,所以这就是我们学习AOP的原因。

AOP把软件分为两类:核心关注点(主业务代码)和横切关注点(共生代码),将代码分离组织就是咱们AOP的职责!

我们都知道OOP编写程序是纵向的,而AOP在此基础上横切业务逻辑代码,并且将共生代码织入切点中并无痕迹的恢复程序原本的结构,这个过程就是AOP对两类代码的组织,并没有对原生代码进行修改,就实现了功能的扩展,说明AOP是没有入侵原生代码的。这样一来对AOP功能有点理解了,而共生代码在上面有介绍,学习AOP术语,我们就显得有点入门的感觉了。

AOP术语

  • 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
  • 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用
  • 切点(PointCut): 可以插入增强处理的连接点。
  • 切面(Aspect): 切面是通知和切点的结合。
  • 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
  • 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。

    概念看起来总是有点懵,并且上述术语,不同的参考书籍上翻译还不一样,所以需要慢慢在应用中理解。

AOP实现

原生代码(核心关注点)TestB:

public class TestB implements C{
@Override
public void add() {
System.out.println("我是TestB的原生代码!");
}
}

共生代码(横切关注点)MyAspect:

public class MyAspect {
//前置通知
public void before(){
System.out.println("我是Before!!!!");
}
//后置通知
public void after(){
System.out.println("我是After!!!!");
}
}

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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置A对象 -->
<bean id="a" class="com.lyl.pojo.TestB"/>
<!-- 配置Aspect 切面类,里面包含了通知 -->
<bean id="aspect" class="com.lyl.schemaAop.MyAspect"/> <!-- 配置SpringAop组装规则 -->
<aop:config>
<!-- 指明要进行功能扩展(切点)的方法,此处要扩展TestB的add()方法 -->
<aop:pointcut id="point" expression="execution(* com.lyl.pojo.TestB.add(..))"/>
<!-- 切面类的组装 -->
<aop:aspect id="at" ref="aspect">
<!-- method:通知的方法;pointcut-ref:需要组织的目标切点 -->
<!-- 前置通知 -->
<aop:before method="before" pointcut-ref="point"/>
<!-- 后置通知 -->
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
</beans>

结果:

我是Before!!!!
我是TestB的原生代码!
我是After!!!!

AOP小结

从上面的SpringAOP简单实现可以看出,我们AOP的特点:

  1. AOP的扩展没有入侵原生代码
  2. OOP纵向,AOP横向,需要增强的原生代码的叫切点,增强过程叫织入
  3. 我们程序员主要关注的是核心关注点,而AOP关注的是横切关注点,并将其织入我们的核心关注点。

我们需要注意的是:

  1. AOP并不是一个框架,而是一种设计模式
  2. AOP最终的作用是松偶解决代码重用方便功能扩展,降低程序的复杂度和耦合度,提高开发效率。
  3. 在AOP中,我们将这些具有公共逻辑的,与其他模块的核心逻辑纠缠在一起的行为称为“横切关注点(Crosscutting Concern)”,因为它跨越了给定编程模型(纵向模型)中的典型职责界限。

随着日后的学习和实践,对于AOP的理解也会越来越深。

初学AOP小结的更多相关文章

  1. 初学AOP

    src\dayday\Count.java package dayday;import org.springframework.stereotype.Component;/** * Created b ...

  2. Spring AOP小结

    一. AOP介绍 AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP ...

  3. AOP小结

    AOP主要采用代理模式来实现的,静态代理(设计模式中的代理模式),动态代理(反射机制,实现InvocationHandler接口),cglib实现(采用继承方式,针对目标类生成子类,并覆盖方法进行增强 ...

  4. Spring 实践 -AOP

    Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...

  5. spring boot 从开发到上线(三)—AOP 异常监控、上报

    在做这个项目的期间,看到一篇很有启发性的文章<程序员你为什么这么累>.对于初级程序员来说,拿到需求,第一反应是用什么技术来尽快的完成任务,这本身并没有问题.但长此以往,不仅被需求的更改搞得 ...

  6. Spring入门篇——第5章 Spring AOP基本概念

    第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...

  7. Spring之IOC、AOP和事务

    IOC 什么是IOC?如果你回答:Spring是个IOC容器,实现原理是反射,没了.这样证明你没有真正理解IOC. IOC的意思是控制反转,还有个外号叫依赖注入(DI).为什么起这么晦涩难懂的名字呢? ...

  8. Spring(3):AOP面向切面编程

    一,AOP介绍 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...

  9. 【Spring Framework】Spring入门教程(六)Spring AOP使用

    Spring的AOP 动态代理模式的缺陷是: 实现类必须要实现接口 -JDK动态代理 无法通过规则制定拦截无需功能增强的方法. Spring-AOP主要弥补了第二个不足,通过规则设置来拦截方法,并对方 ...

随机推荐

  1. 大数据学习(08)—— Hive简介

    前面的Hadoop学习是非常体系化的,有主线有细节.到了Hive这里,知识点非常零散,感觉没有什么主线能把它串起来.从官方网站上就能看出这点差异. 什么是Hive Hive是一个基于Hadoop的企业 ...

  2. openssl not found 离线安装的openssl问题

    离线安装问题 正常我们在Linux中按照 nginx的openssl依赖都是通过 yum来安装的,但是由于一些特殊的服务器公司不让服务器连接互联网,所以就导致我们必须通过离线方式来进行安装,但是我们离 ...

  3. 对象转换工具 MapStruct 介绍

    前言 在我们日常开发的分层结构的应用程序中,为了各层之间互相解耦,一般都会定义不同的对象用来在不同层之间传递数据,因此,就有了各种 XXXDTO.XXXVO.XXXBO 等基于数据库对象派生出来的对象 ...

  4. Java互联网架构师系统进阶课程学习 (4)【享学】

    Java互联网架构师系统进阶课程学习 (4)[享学] 4.显式锁和AQS   显式锁 Lock接口和核心方法 Lock接口和synchronized的比较 synchronized 代码简洁,Lock ...

  5. AcWing 第11场周赛题解

    计算abc 首先 \(0<=a<=b<=c\) 会随机给出 \(a+b,a+c,b+c,a+b+c\)的值 因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值 然后 ...

  6. Kerberos委派攻击

    域委派 就是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动. 在域中一般只有主机账号和服务账号才具有委派属性 主机账号:主机账号就是AD(活动目录)中Computers中的 ...

  7. 为什么npm install 经常失败

    Hello 您好,我是大粽子.深耕线上商城的攻城狮(程序员)一枚. 前言 这段时间真的是忙,最近能抽时间搞搞大家在自己环境中遇到的各种问题了,我呢就是见不得我的代码在你的电脑运行不起来的.就像姜子牙睡 ...

  8. [C++]-map和unordered_map

    转自:https://blog.csdn.net/BillCYJ/article/details/78985895 头文件不同 map: #include < map > unordere ...

  9. Python - pydantic 入门介绍与 Models 的简单使用

    前言 为啥要学这个,因为 FastAPI 是基于它进行开发的,而且是个不错的框架,所以有必要深入学习 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p ...

  10. DNS的正向解析与反向解析

    DNS域名解析服务(Domain Name System)是用于解析域名与IP地址对应关系的服务,功能上可以实现正向解析与反向解析: 正向解析:根据主机名(域名)查找对应的IP地址. 反向解析:根据I ...