目录

1. 要求

2. 涉及的知识点

3. 示例工程 (第一种方式)

3.1 maven的配置文件: pom.xml

3.2 bean配置文件: bean_aop_around.xml

3.3 接口和类的代码

3.3.1 接口:UserService

3.3.2 实现接口的类:UserServiceImpl

3.3.3 AroundLog类:AroundLog

3.4 测试类

4. 示例工程(第二种方式)

4.1 maven的配置文件: pom.xml

4.2 bean配置文件: bean_aop_around2.xml

4.3 接口和类的代码

4.3.1 接口:UserService

4.3.2 实现接口的类:UserServiceImpl

4.3.3 AnnotationPointcut类:

4.4 测试类


1. 要求

之前完成了通过@Before@After的方式,完成了对类UserServiceImpl中的search方法的aop操作 ,这里要求:通过@Aspect注解的方式实现对UserServiceImpl的aop的@Around操作!

前文:

Java练习(十):Spring应用之AOP的@Before, @After操作(简单工程示例)

2. 涉及的知识点

@Before, @After, @Around三者之前的关系:

@Before 是在所拦截方法执行之前执行一段逻辑。

@After 是在所拦截方法执行之后执行一段逻辑。

@Around 是可以同时在所拦截方法的前后执行一段逻辑。

简言之,@Around就包含了@Before和@After两个操作。

3. 示例工程 (第一种方式)

3.1 maven的配置文件: pom.xml 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>MySpringAOPAround</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.3</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies></project>

3.2 bean配置文件: bean_aop_around.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><context:annotation-config/><!--注册bean--><bean id="userService" class="com.my.spring.aop.around.UserServiceImpl"/><bean id="aroundLog" class="com.my.spring.aop.around.AroundLog"/>
<!--    <bean id="beforeLog" class="com.my.spring.aop.around.BeforeLog"/>-->
<!--    <bean id="afterLog" class="com.my.spring.aop.around.AfterLog"/>--><!--aop的配置--><aop:config><!--切入点 expression:表达式匹配要执行的方法--><aop:pointcut id="pointcut" expression="execution(* com.my.spring.aop.around.UserServiceImpl.*(..))"/><aop:advisor advice-ref="aroundLog" pointcut-ref="pointcut"/>
<!--        <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>-->
<!--        <aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut"/>--></aop:config></beans>

3.3 接口和类的代码

3.3.1 接口:UserService

package com.my.spring.aop.around;public interface UserService {public void add();public void delete();public void update();public void search();
}

3.3.2 实现接口的类:UserServiceImpl

package com.my.spring.aop.around;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 search() {System.out.println("查询用户");}
}

3.3.3 AroundLog类:AroundLog

package com.my.spring.aop.around;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;public class AroundLog implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {String name = invocation.getMethod().getName();System.out.println("环绕通知: " + name + "方法即将开始!");// 调用目标对象的指定方法//真正调用目标方法Object result = invocation.proceed();System.out.println("环绕通知: " + name + "方法到此结束!");return result;}
}

3.4 测试类 

package com.my.spring.around.demo;import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MySpringAOPAroundTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around.xml");UserService userService = (UserService) context.getBean("userService");userService.search();}}

输出结果:

环绕通知: search方法即将开始!
查询用户
环绕通知: search方法到此结束!

4. 示例工程(第二种方式)

用注解标签 @Aspect, @Around。

简言之,就是简化了bean配置文件里的内容,设置语句<aop:aspectj-autoproxy/>自动扫描,在工程中自动查找标签 @Aspect, @Around等。

4.1 maven的配置文件: pom.xml

同3.1,这里不赘述。

4.2 bean配置文件: bean_aop_around2.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><context:annotation-config/><!--注册bean--><bean id="annotationPointcut" class="com.my.spring.aop.around.AnnotationPointcut"/><bean id="userService2" class="com.my.spring.aop.around.UserServiceImpl"/><!-- 简化了bean配置文件里的内容,设置语句<aop:aspectj-autoproxy/>自动扫描 --><aop:aspectj-autoproxy/></beans>

4.3 接口和类的代码

4.3.1 接口:UserService

package com.my.spring.aop.around;public interface UserService {public void add();public void delete();public void update();public void search();
}

4.3.2 实现接口的类:UserServiceImpl

package com.my.spring.aop.around;public class UserServiceImpl implements UserService{public void add() {System.out.println("增加用户2");}public void delete() {System.out.println("删除用户2");}public void update() {System.out.println("更新用户2");}public void search() {System.out.println("查询用户2");}
}

4.3.3 AnnotationPointcut类:

类似于第一种方法中的AroundLog类,实现环绕效果,方法的调用。

使用注解@Aspect, @Around。

package com.my.spring.aop.around;// 如果自动扫描<aop:aspectj-autoproxy/>,那么程序肯定找标签
// 在整个工程里找标签,即如果包含多个类文件,多个@Aspect,程序都会找到并执行。
// 但真实的情况下,同一个方法,不会用多个@Aroundimport org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;@Aspect
public class AnnotationPointcut {/*@Before("execution(*  com.my.demo.aop.UserServiceImpl.*(..))")public void before(){System.out.println("---------方法执行前---------");}@After("execution(* com.my.demo.aop.UserServiceImpl.*(..))")public void after(){System.out.println("---------方法执行后---------");}*/@Around("execution(* com.my.spring.aop.around.UserServiceImpl.*(..))")public void around(ProceedingJoinPoint jp) throws Throwable{System.out.println("~~~~~~~~~~~~~~~~Around方法执行前~~~~~~~~~~~~~~~~~~~~~");System.out.println("签名: "+jp.getSignature());Object proceed = jp.proceed(); //执行目标方法System.out.println("~~~~~~~~~~~~~~~~Around方法执行后~~~~~~~~~~~~~~~~~~~~~");}
}

4.4 测试类 

package com.my.spring.around.demo;import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MySpringAOPAroundTest2 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around2.xml");UserService userService = (UserService) context.getBean("userService2");userService.search();}
}

输出结果:

~~~~~~~~~~~~~~~~Around方法执行前~~~~~~~~~~~~~~~~~~~~~
签名: void com.my.spring.aop.around.UserService.search()
查询用户2
~~~~~~~~~~~~~~~~Around方法执行后~~~~~~~~~~~~~~~~~~~~~

Java练习(十九):编写代码,实现AOP的@Around操作 (两种写法)相关推荐

  1. ReactNative系列之十九表情emoji与文字混排的两种方案实现

    注:2019/12/06,升级最新RN0.61,新版RN源代码已经适配了我改的地方(但新版本的源码在纯表情的时候计算的有bug, 我的改法依然没问题~量力使用吧) 以下方案在RN0.51上做的修改 方 ...

  2. java第十九次学习笔记

    java第十九次学习笔记 异常 java第十九次学习笔记 前言 一.try catch 二.多个异常如何处理 前言 斯人若彩虹遇上方知有 一.try catch package Demo01;impo ...

  3. Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称

    Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称 文章目录

  4. 【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法

    本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载.(这标题有些歧义的,这个几种是修饰 ...

  5. 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  6. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  7. Spring AOP拦截规则的两种定义方式

    Spring AOP拦截规则的两种定义方式 AOP的根本目的就是解耦,分开业务代码与系统共用代码,例如打印日志. Spring支持AspectJ的注解式切面编程,主要包含4个部分,分别是 使用@Asp ...

  8. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  9. java 获取星期几_java中获取日期是星期几的两种方法

    java中取得指定日期是星期几可以采用下面两种方式取得日期是星期几:(推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWee ...

最新文章

  1. 《深度学习:Java语言实现》一一2.6小结
  2. 一键ghost奥运版_超详细的纯净版windows系统重装示例
  3. linux命令学习——file
  4. Oracle 原理: 过程和函数
  5. 用SHELL访问特定的URL
  6. 手把手教你如何写简历
  7. 测试工程师不懂AI,还有未来吗?
  8. Captaris WorkFlow的开发和部署
  9. L230 RF可靠性测试-RF指标
  10. 常用激活函数(激励函数)理解与总结
  11. 【笔记】QCA9531无线校准
  12. Spring 5.0.3.RELEASE中的 Kotlin 语言等支持
  13. UIImageJPEGRepresentation 使用中存在的问题
  14. 旧文重发:从第三方服务角度看各公司技术部门如何正确计算投入产出比~
  15. gitbook:node_modules\npm\node_modules\graceful-fs\polyfills.js:287
  16. mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析
  17. Axure RP9——【图片放大预览效果】
  18. 【浙江大学C小程week2整理】
  19. DCM4CHE处理多帧图像
  20. 日撸leetCode三道题---Day4---双指针和字符串

热门文章

  1. 【电气专业知识问答】问:电力系统稳定器PSS的定义和功能是什么?投用时应注意哪些问题?
  2. 微软七月十四日发行四个安全补丁
  3. 100个Myeclipse6.5免费注册码
  4. vector和list的使用
  5. GIS论坛网站推荐!
  6. .net 前台调用后台方法
  7. 基于PTGui和Ps 有手和低端手机就能拼接生成一张酷酷VR720°商用全景图
  8. NOAA气象监测数据下载(可下载最新及每日气象数据)
  9. 如何架设一个属于自己的Discuz论坛
  10. 7-20 表达式转换 (25 分)