文章目录

  • AOP-面向切面编程
    • 1. 什么是AOP?
    • 2. Aop在Spring中的作用
    • 3. 使用Spring实现Aop
      • 3.1 通过 Spring API 实现
      • 3.2 自定义类来实现Aop
      • 3.3 使用注解实现Aop

AOP-面向切面编程

1. 什么是AOP?

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2. Aop在Spring中的作用

提供声明式事务;允许用户自定义切面

AOP相关名词概念

  • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 …

  • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。

  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。

  • 目标(Target):被通知对象。

  • 代理(Proxy):向目标对象应用通知之后创建的对象。

  • 切入点(PointCut):切面通知 执行的 “地点”的定义。

  • 连接点(JointPoint):与切入点匹配的执行点。

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:
1、Interception Around(实现MethodInterceptor接口)
2、Before
3、After Returning
4、Throw
5、Introduction

即 Aop 在 不改变原有代码的情况下 , 去增加新的功能 .

3. 使用Spring实现Aop

3.1 通过 Spring API 实现

1.编写业务接口和实现类

public interface UserService {void add();void delete();void update();void select();}
public class UserServiceImpl implements UserService{public void add() {System.out.println("增加了一个用户");}public void delete() {System.out.println("删除了一个用户");}public void update() {System.out.println("修改了一个用户");}public void select() {System.out.println("查询了一个用户");}
}

2.然后写增强类,一个前置增强,一个后置增强

public class Log  implements MethodBeforeAdvice {//method : 要执行的目标对象的方法//objects : 被调用的方法的参数//Object : 目标对象public void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println(o.getClass().getName()+"的"+method.getName()+"方法被执行了");}
}
public class AfterLog implements AfterReturningAdvice {//o 返回值//method被调用的方法//args 被调用的方法的对象的参数//o1 被调用的目标对象public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {System.out.println("执行了"+o1.getClass().getName()+"的"+method.getName()+"方法,"+"返回值"+o);}
}

3.最后去spring文件中注册bean,并实现aop切入,注意导入aop约束

<?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/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--注册bean--><bean id="userService" class="com.zh.service.UserServiceImpl"/><bean id="log" class="com.zh.log.Log"/><bean id="afterLog" class="com.zh.log.AfterLog"/><!--aop的配置--><aop:config><!--切入点 expression:表达式匹配要执行的方法--><aop:pointcut id="pointcut" expression="execution(* com.zh.service.UserServiceImpl.*(..))"/><!--执行环绕; advice-ref执行方法 . pointcut-ref切入点--><aop:advisor advice-ref="log" pointcut-ref="pointcut"/><aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/></aop:config></beans>

4.测试

public class MyTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");UserService userService = context.getBean("userService", UserService.class);userService.select();}
}

3.2 自定义类来实现Aop

1.写一个自定义切入类

public class DiyPointCut {public void before(){System.out.println("---------方法执行前--------");}public void after(){System.out.println("---------方法执行后--------");}
}

2.配置spring

   <!--第二种方式自定义实现--><!--注册bean--><bean id="diy" class="com.zh.diy.DiyPointCut"/><aop:config ><aop:aspect ref="diy"><aop:pointcut id="diyPointCut" expression="execution(* com.zh.service.UserServiceImpl.*(..))"/><aop:before method="before" pointcut-ref="diyPointCut"/><aop:after method="after" pointcut-ref="diyPointCut"/></aop:aspect></aop:config>

3.测试

3.3 使用注解实现Aop

1.编写一个注解实现的增强类

@Aspect
public class AnnotationPointcut {@Before("execution(* com.zh.service.UserServiceImpl.*(..))")public void before(){System.out.println("---------方法执行前--------");}@After("execution(* com.zh.service.UserServiceImpl.*(..))")public void after(){System.out.println("---------方法执行后--------");}@Around("execution(* com.zh.service.UserServiceImpl.*(..))")public void around(ProceedingJoinPoint jp) throws Throwable{System.out.println("环绕前");System.out.println("签名:"+jp.getSignature());//执行目标方法proceedObject proceed = jp.proceed();System.out.println("环绕后");System.out.println(proceed);}
}

2.在Spring配置文件中,注册bean,并增加支持注解的配置

<!--开启注解支持--><aop:aspectj-autoproxy/><bean id="annotationPointcut" class="com.zh.diy.AnnotationPointcut"/>

3.测试

    @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");UserService userService = context.getBean("userService", UserService.class);userService.select();}

(Spring)AOP-面向切面编程相关推荐

  1. Java绝地求生—Spring AOP面向切面编程

    Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...

  2. Spring AOP面向切面编程

    AOP面向切面编程: AOP(Aspect Oriented Programming),即面向切面编程,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公 ...

  3. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. 需要在 ...

  4. Spring Aop面向切面编程自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  5. Spring AOP 面向切面编程

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

  6. Spring AOP(面向切面编程)

    AOP(Aspect Oriented Programming),也就是面向切面编程,作为面向对象编程的一种补充,AOP已经成为一种比较成熟的编程方式.可以这样理解:OOP是从静态角度考虑程序结构,而 ...

  7. java框架013——Spring AOP面向切面编程

    一.Spring AOP简介 AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编 ...

  8. JavaEE——Spring AOP(面向切面编程)

    目录 1.面向切面编程(AOP) 2.AOP术语 3.AOP类型 4.AOP 的优势 5.Spring AOP 的代理机制 6.Spring AOP 连接点 7.Spring AOP 通知类型 8.基 ...

  9. Spring AOP面向切面编程:理解篇(一看就明白)

    一直想着怎么去通俗的讲解AOP,看了一篇文章受到了启发(https://blog.csdn.net/qukaiwei/article/details/50367761),下面我加入自己的理解,咱们来说 ...

  10. Spring aop面向切面编程概述

    aop概述 1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统一维护的一种技术.使代码耦合性降低,提高 ...

最新文章

  1. 网络编程- 解决黏包现象方案一(六)
  2. Sprint会议记录(第五组)
  3. hadoop学习-stream-Top K记录
  4. 10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……
  5. eclipse启动tomcat不能正常访问问题
  6. mysql start
  7. PHPOffice下PHPWord生成Word2007(docx)使用方法
  8. [转载] 快速入门(完整):Python实例100个(基于最新Python3.7版本)
  9. python datetime处理时间
  10. 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。
  11. 微带线特性阻抗计算公式_传输线特性阻抗计算方式
  12. 千方百剂创建账套服务器文件,千方百剂各工具使用.doc
  13. 微信小程序底部导航栏tabBar及不显示问题解决记录
  14. 计算机出现蓝屏怎么恢复,电脑蓝屏怎么解决,小编教你如何恢复正常
  15. Win10:修改电脑桌面路径
  16. POI Excel设置列宽
  17. 西班牙国家德比次回合时间确定 中国球迷需熬夜
  18. access_token VS refresh_token
  19. Azure CDN 服务详解
  20. ubuntu 刷新频率 如何查看_Ubuntu 7.04救命啊!屏幕刷新频率只有50HZ眼不行啦!显示器是CRT...

热门文章

  1. STL源代码分析(ch 1)组态1
  2. 趣链 BitXHub跨链平台 (2)跨链网络拓扑
  3. [记录]-Cortex-A76仅EL0支持aarch32
  4. [ARM异常]-同步异常产生和返回(svc/hyc/smc/eret)
  5. VScode Python插件
  6. dft变换的两幅图_快速傅里叶变换FFT计算方法 原理及公式
  7. DMB DSB ISB 简介
  8. 2020-11-13(混淆技术)
  9. python生成随机字符串
  10. 【正则】匹配html标签里的内容,不含标签