章节目标:详细解释什么是Spring AOP思想和对于该思想实现的AspectJ框架的实现用法。

一.AOP面向切面编程

1.AOP概述

AOP(Aspect Orient Programming)面向切面编程,卖你想切面编程是从倒台角度烤炉程序运行过程。

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

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

面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切面织入到主业务逻辑中。所谓交叉逻辑是指,通用的和主业务逻辑没有关系的代码。如安全检查、事务、日志、缓存等。

若不使用AOP,则会出现代码纠缠,即交叉业务逻辑和主业务逻辑混合在一起,这样会使著业务逻辑混杂不清。

例如:转账业务,在实现转账业务逻辑的前后,需要权限控制,日志记录,加载事务,结束事务等交叉业务逻辑,而这些业务逻辑和主业务逻辑之间并没有直接关系。但是他们的代码量所占比重可以达到总代码量的一版甚至还多。它们的存在,不仅仅产生了大量的“冗余”代码,还大大干扰了主业务逻辑。

2.AOP思想有什么好处

3.AOP编程术语

(1)切面(Aspect)

切面泛指交叉业务逻辑,例如:事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice).实际就是对业务逻辑的一种增强。

切面就是一个普通类,将用于增强目标类功能的其他功能封装到一个类中,这个类就叫切面类,切面类需要使用@Aspect注解标注,切面类中用于增强目标类功能的方法就是普通方法,通过配置文件、将切面中的功能增强到目标类的目标方法中。



二.AspectJ

1.AspectJ概述


2.AspectJ切入点表达式


3.AspectJ的通知类型

AspectJ中常用的通知类型有五种类型:
前置通知:Before()
后置通知:AfterReturning()
环绕通知:Around()
异常通知:AfterThrowing()
最终通知:After()

4.初始化Aspectj开发环境

加入Spring框架的依赖和AspectJ依赖

在使用AspectJ框架实现AOP思想的时候,要引入AOP的约束,配置文件中使用AOP约束中的标签都是AspectJ框架中的,而不是Spring框架本身的。AsprctJ对于AOP思想的实现有注解和配置文件两种方式,这里讲解的是注解方式。

5.AspectJ基于注解的方式实现AOP思想

(1)定义业务接口和实现类


(2)定义切面类

(3)在spring核心配置文件中声明 切面类和目标类对象

(4)注册AspectJ的自动代理

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--把对象交给spring容器,由spring容器统一创建,管理对象--><!--声明目标对象--><bean id="someService" class="com.bjpowernode.ba01.SomeServiceImpl" /><!--声明切面类对象--><bean id="myAspect" class="com.bjpowernode.ba01.MyAspect" /><!--声明自动代理生成器:使用aspectj框架内部的功能,创建目标对象的代理对象。创建代理对象是在内存中实现的, 修改目标对象的内存中的结构。 创建为代理对象所以目标对象就是被修改后的代理对象.aspectj-autoproxy:会把spring容器中的所有的目标对象,一次性都生成代理对象。--><aop:aspectj-autoproxy /><!--有接口也想用cjlib实现动态代理:如果你期望目标类有接口,使用cglib代理proxy-target-class="true":告诉框架,要使用cglib动态代理-->
<!--    <aop:aspectj-autoproxy proxy-target-class="true"/>-->
</beans>

6.AspectJ中实现动态代理

1.目标类有接口默认使用的是JDK动态代理;
2. 目标类没有接口默认使用的是CJLIB动态代理;
3. 目标类有接口也可以使用CJLIB动态代理,但是需要设置spring核心配置文件中的<aop:aspectj-autoproxy >标签;

修改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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--把对象交给spring容器,由spring容器统一创建,管理对象--><!--声明目标对象--><bean id="someService" class="com.bjpowernode.ba01.SomeServiceImpl" /><!--声明切面类对象--><bean id="myAspect" class="com.bjpowernode.ba01.MyAspect" /><!--声明自动代理生成器:使用aspectj框架内部的功能,创建目标对象的代理对象。创建代理对象是在内存中实现的, 修改目标对象的内存中的结构。 创建为代理对象所以目标对象就是被修改后的代理对象.aspectj-autoproxy:会把spring容器中的所有的目标对象,一次性都生成代理对象。--><aop:aspectj-autoproxy /><!--有接口也想用cjlib实现动态代理:如果你期望目标类有接口,使用cglib代理proxy-target-class="true":告诉框架,要使用cglib动态代理-->
<!--    <aop:aspectj-autoproxy proxy-target-class="true"/>-->
</beans>

三.AspectJ的常用通知类型

1.@Before前置通知-参数JoinPoint

2.@AfterReturning后置通知-returning属性

  1. @Around环绕通知- ProceedingJoinPoint 参数

  1. @AfterThrowing异常通知-throwing属性

5.@After最终通知(相当于finally)


6.@Pointcut定义切入点

Spring的AOP思想和实现AOP思想的框架AspectJ相关推荐

  1. Spring学习8-Spring事务管理(AOP/声明式式事务管理)

    一.基础知识普及 声明式事务的事务属性: 一:传播行为 二:隔离级别 三:只读提示 四:事务超时间隔 五:异常:指定除去RuntimeException其他回滚异常.  传播行为: 所谓事务的传播行为 ...

  2. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  3. Spring源码学习笔记:Spring设计模式对比和Spring的OOB,BOP,AOP,IOC,DI/DL

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 1.GOF 23总设计模式归纳 分类 设计模式 创建型 工厂方法模式(Factory Method).抽象工厂 ...

  4. Spring 学习 (三)大话AOP

    一直想着怎么去通俗的讲解AOP,这两篇博客给了我启发 (https://blog.csdn.net/qukaiwei/article/details/50367761),(https://blog.c ...

  5. Spring(二) -- 春风拂面之 核心 AOP

    "万物皆对象"是面向对象编程思想OOP(Object Oriented Programming) 的最高境界.在面向对象中,我一直将自己(开发者)放在一个至高无上的位置上,可以操纵 ...

  6. Spring事务原理深入解析(AOP,Threadlocal, 隔离级别,传播级别)

    文章目录 一.摘要 二.基础知识介绍 2.1 JDBC 2.1.1 简单示例 2.1.2 JDBC事务存在的问题: 2.1.2 Spring事务解决该问题的方式 2.2 AOP设计思想 2.2.1 代 ...

  7. spring进阶第三天之AOP

    spring第三天之aop 在了解aop之前有必要先知道两个知识 静态代理和动态代理 静态代理 某个对象提供一个代理,代理角色固定,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在 ...

  8. Spring常用注解,注解 IOC ,AOP,MVC 的理解

    文章目录 大佬总结 0.Spring常用注解 0.1.SpringBootController里面的用法 0.1.1.SpringBoot 中常用注解@Controller/@RestControll ...

  9. (Spring)静态/动态代理模式(AOP底层)

    文章目录 1.静态代理 2.动态代理 1.静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象类来实现 真实角色 : 被代理的角色 代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会 ...

最新文章

  1. 秋天六食物吃出好皮肤
  2. jbpm人工终止的开发
  3. Liunx安装JDK,tomcat,mysql的依赖包命令
  4. leetcode 621. 任务调度器(贪心算法)
  5. C/C++——从ctime使用到随便测一样冒泡排序和堆排序的效率
  6. CodeForces 13C【DP】
  7. python静态属性@property、类方法@classmethod、静态方法@staticmethod和普通方法
  8. javascript 技巧总结积累1-108条(正在积累中)
  9. yii2搭建完美后台并实现rbac权限控制实例教程
  10. Powerpoint中VBA编程技巧
  11. 【Unity3D】动态更换天空盒(场景不受天空盒影响 等问题)
  12. Android计分器课程设计,比赛计分器课程设计.doc
  13. Java冒泡排序代码实现
  14. html在线直播ppt,PPT在HTML网页上播放方法
  15. 解决在mysql官网下载慢的问题
  16. c报错pointer being freed was not allocated
  17. 一道阿姆斯特朗回旋好题( Convex HDU - 5979)
  18. 使用html5与js实现音乐播放器
  19. python爬取收费漫画_Python爬虫,爬取腾讯漫画实战
  20. 分享:用Python语言轻松实现二代身份证阅读器(读卡器)自动读卡,支持定制开发

热门文章

  1. 桌面云实验环境的部署配置
  2. MSTP和MPLS专线有什么区别?——Vecloud
  3. IPSec的安全性如何?—微云MPLS
  4. windows下编译openssl
  5. Linux - 后台运行 ctrl + z , jobs , bg , fg
  6. Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现
  7. intel 汇编中断解释
  8. 用 C# 做组件设计时的事件实现方法讨论
  9. 功能安全-26262(2018) part5
  10. 黑龙江2020计算机一级考试时间,黑龙江2020年计算机等级考试报名时间汇总