Java练习(十九):编写代码,实现AOP的@Around操作 (两种写法)
目录
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操作 (两种写法)相关推荐
- ReactNative系列之十九表情emoji与文字混排的两种方案实现
注:2019/12/06,升级最新RN0.61,新版RN源代码已经适配了我改的地方(但新版本的源码在纯表情的时候计算的有bug, 我的改法依然没问题~量力使用吧) 以下方案在RN0.51上做的修改 方 ...
- java第十九次学习笔记
java第十九次学习笔记 异常 java第十九次学习笔记 前言 一.try catch 二.多个异常如何处理 前言 斯人若彩虹遇上方知有 一.try catch package Demo01;impo ...
- Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称
Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称 文章目录
- 【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法
本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载.(这标题有些歧义的,这个几种是修饰 ...
- 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- spring中AOP动态代理的两种方式
AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...
- Spring AOP拦截规则的两种定义方式
Spring AOP拦截规则的两种定义方式 AOP的根本目的就是解耦,分开业务代码与系统共用代码,例如打印日志. Spring支持AspectJ的注解式切面编程,主要包含4个部分,分别是 使用@Asp ...
- JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)
JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer
- java 获取星期几_java中获取日期是星期几的两种方法
java中取得指定日期是星期几可以采用下面两种方式取得日期是星期几:(推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWee ...
最新文章
- 《深度学习:Java语言实现》一一2.6小结
- 一键ghost奥运版_超详细的纯净版windows系统重装示例
- linux命令学习——file
- Oracle 原理: 过程和函数
- 用SHELL访问特定的URL
- 手把手教你如何写简历
- 测试工程师不懂AI,还有未来吗?
- Captaris WorkFlow的开发和部署
- L230 RF可靠性测试-RF指标
- 常用激活函数(激励函数)理解与总结
- 【笔记】QCA9531无线校准
- Spring 5.0.3.RELEASE中的 Kotlin 语言等支持
- UIImageJPEGRepresentation 使用中存在的问题
- 旧文重发:从第三方服务角度看各公司技术部门如何正确计算投入产出比~
- gitbook:node_modules\npm\node_modules\graceful-fs\polyfills.js:287
- mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析
- Axure RP9——【图片放大预览效果】
- 【浙江大学C小程week2整理】
- DCM4CHE处理多帧图像
- 日撸leetCode三道题---Day4---双指针和字符串