SpringAOP--aop使用
SpringAOP使用方式
切点表达式
常用的符号:
*:匹配任何数量字符;
..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。
+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。
一种常用的切点表达式如下:
(1):execution(* com.nuofankj.springdemo.aop.Service.(..))
(2):execution(* com.sample.service.impl..*.*(..))
(1)返回类型为任意类型,以Service开头的方法名,参数为任意参数;
(2)返回类型为任意类型,impl包及其子包(..)下的所有类的所有方法,任意参数类型;
基于切点表达式的使用方式
- 1 可以通过在切点中配置,拿到入参信息
//切点方法为:
@Override
public String saveUser(String user,Integer age) {
System.out.println("保存用户信息");
if (Objects.equals(user,"e")){
throw new RuntimeException();
}
return null;
}
/**切点配置为*/
//方式一:通过pointcut方法中定义参数,拿到切点处的参数
//通过Pointcut方法配置,拿到入参
@Pointcut(value = "execution(* com.wht.springaop.USerService.saveUser(..)) && args(cat,dog)")
public void pointcut2(String cat,Integer dog){
};
@Around("pointcut2(cat,dog)")
public Object aroundExe(ProceedingJoinPoint joinPoint,String cat,Integer dog) throws Throwable {
System.out.println("around1切面执行。。。");
try {
return joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
throw throwable;
}finally {
System.out.println("around2切面执行。。。");
}
}
- 2 个人感觉最常用的还是这种,通过JoinPoint拿到入参信息
//通过JoinPoint拿到方法的入参信息
@After("execution(* com.wht.springaop.USerService.testNormalAop(..))")
public void AfterExe(JoinPoint point){
Object[] args = point.getArgs();
//参见JoinPoint的API介绍
System.out.println("切点获取传入的参数为:"+ Arrays.asList(args));
System.out.println("after:测试普通AOP方法");
}
- 3 另外可以通过自定义注解的方式使用,更加灵活
/**首先自定义注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
String value() default "我是注解";
// int key();
}
/**在要切入的方法上使用此注解*/
@Log(value = "Log注解AOP")
@Override
public String testAnnotationAop(String name) {
System.out.println("测试注解AOP方法");
return "AOP注解方式";
}
/**配置切点,进行功能代码织入,同样有两种方式*/
//【1】表示切点在Log注解标识的方法上,这种将Log写入参数中的形式能直接拿到Log注解信息
@Pointcut(value = "@annotation(log)")
public void pointcut(Log log){
}
@Around(value = "pointcut(log)")
public Object get(ProceedingJoinPoint point,Log log) throws Throwable {
System.out.println(log.value());//能拿到注解的值
point.proceed();
System.out.println("Around02注解AOP");//环绕通知
return "123";
}
//【2】这种方式只能通过获取方法,然后获取方法上的注解的形式拿到,且@annotation需要配置注解的全限定名。
@Before(value = "@annotation(com.wht.springaop.Log)")
public void beforeExe(JoinPoint point){
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
//获取参数列表
String[] names = signature.getParameterNames();
//获取方法上的注解
Log log = method.getAnnotation(Log.class);
System.out.println("注解式拦截 " + log.value());
}
配置切面时,不要忘记将切面类SpringBoot启动时注入为Bean实例,同时标记为切面类。即使用注解:
@Aspect 和
@Component
JoinPoint切点的常用方法:
Signature getSignature(): 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs(): 获取传入目标方法的参数对象
Object getTarget(): 获取被代理的对象
Object getThis(): 获取代理对象 `
SpringAOP--aop使用的更多相关文章
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- springaop——AspectJ不可不知的细节
springaop简介 springaop是spring对AOP技术的具体实现,它是spring框架的核心技术.springaop底层使用JDK动态代理或CGLIB动态代理技术实现. 应用场景: 在多 ...
- Spring框架的基本使用(AOP部分)
AOP,Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP采取横向抽取机制,取代了传统纵向继承体系重复 ...
- 使用@AspectJ注解开发Spring AOP
一.实体类: Role public class Role { private int id; private String roleName; private String note; @Overr ...
- Spring的AOP原理
转自 https://www.tianmaying.com/tutorial/spring-aop AOP是什么? 软件工程有一个基本原则叫做“关注点分离”(Concern Separation),通 ...
- SpringMVC利用AOP实现自定义注解记录日志
作者:飞翔的拖鞋up 推荐:彻底征服 Spring AOP 之 实战篇 推荐:jason_zhangz 本文抛砖引玉,并没有详细的介绍更全面的内容,通过一个例子让初次使用的人能够快速入门,简单的介绍一 ...
- SpringAOP+RabbitMQ+WebSocket实战
背景 最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知.管理员分配任务是在我们的系统A,而员工接受任务是在系统B.两个系统都是现在已投入使用的系统. 技术选型 ...
- JAVA spring 常用包作用
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- JAVA spring 常用包作用详解(转)
转载地址:https://www.cnblogs.com/Tmc-Blog/p/6093162.html <project xmlns="http://maven.apache.org ...
- Java高级工程师面试宝典
Java高级工程师面试宝典 JavaSE 多线程 进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. 为什么要用多线程? 答:提高程序效率 多线程创 ...
随机推荐
- 学习Spring5必知必会(3)~Spring的核心 IoC 和 DI
一.Spring的核心 IoC(基于XML) 1.IoC容器 (1)BeanFactory容器创建对象: //使用BeanFactory @Test void testBeanFactory() th ...
- Maven-compiler-plugin 插件编译过程中报缺失get/set方法
一般都是由于使用了lombok插件导致的 解决方法: 首先将compiler插件版本升级到3.3以上, 查询资料发现说有可能是版本太低导致 在configuration中添加上annotationPr ...
- Oracle之表和字段的注释
给表名加上注释 --给表名加上注释的语法结构 --语法结构:COMMENT ON TABLE 英文表名 IS '中文注释' COMMENT ON TABLE DEPT IS '部门表'; 给字段加上注 ...
- Qt:打包成可执行文件(exe文件)后出现Driver not Loaded的解决方法
问题 在当前电脑上打包为exe可以正常执行,发送给另一台电脑后却无法执行,并且出现"Driver not loaded"的提示框. 可能原因 1.另一台电脑上没有MySQL(或ex ...
- 数据库连接池与SQL工具类
数据库连接池与SQL工具类 1.数据库连接池 依赖包 pymysql dbutils # -*- coding: utf-8 -*- ''' @Time : 2021/11/19 16:45 @Aut ...
- java中如何将嵌套循环性能提高500倍
java中如何将嵌套循环性能提高500倍 转载请注明出处https://www.cnblogs.com/funnyzpc/p/15975882.html 前面 似乎上一次更新在遥远的九月份,按照既定的 ...
- JZ-069-在 O(1) 时间内删除链表节点
在 O(1) 时间内删除链表节点 题目描述 在 O(1) 时间内删除链表节点. 方案:如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复 ...
- TCP/IP方法安装打印机
在计算机安装打印机驱动和添加打印机(TCP/IP方法) 一:打印机的型号和驱动. 1.1:如何知道自己的打印机是什么品牌和型号?: 通过观察打印机表面的logo或者其他文字图案来辨别 如下图: 1.2 ...
- mysql中创建函数时报错信息
报错信息如下 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its ...
- js json.stringfy()和json.parse()的用法
1.JSON.parse;作用:将JavaScript对象表示法的JSON字符串转换为对象(字符串转对象)语法:JSON.parse(text [, reviver])text 必选. 一个有效的 J ...