AOP 实现自定义注解
1.自定义注解
2.编写 AOP
3.测试
1.自定义注解
package com.base.yun.spring.aop; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 说明:
* 定义日志注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FileLog { String value() default "记录日志"; }
2.编写 AOP
package com.base.yun.spring.aop; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; /**
* 说明: 日志的切面处理程序
*/
@Aspect
@Component
public class LogAspect { @Before("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
public void doAccessCheck(JoinPoint jp, FileLog fileLog) {
System.out.println("前置通知-->>");
} @After("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
public void doAfterReturning(JoinPoint jp, FileLog fileLog) {
System.out.println("后置通知-->>");
} @Around("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
public Object doAround(ProceedingJoinPoint pJoinPoint, FileLog fileLog) throws Throwable {
System.out.println("环绕通知开始");
// 这里如果pJoinPoint.proceed()不执行,后面拦截到的方法都不会执行,非常适用于权限管理
Object result = pJoinPoint.proceed();
System.out.println("环绕通知结束");
return result;
} @AfterReturning("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
public void addSuccessLog(JoinPoint jp, FileLog fileLog) {
Object[] parames = jp.getArgs();
// 获取目标方法体参数
String className = jp.getTarget().getClass().toString();
// 获取目标类名
String signature = jp.getSignature().toString();
// 获取目标方法签名
String methodName = signature.substring(signature.lastIndexOf(".") + 1,
signature.indexOf("("));
// 获取注解值
String desc = fileLog.value();
// 把调用的信息写到日常记录信息里面去...
System.out.println("最终通知注解值:"+desc);
} // 标注该方法体为异常通知,当目标方法出现异常时,执行该方法体
@AfterThrowing(pointcut = "within(com.base.yun.spring.service.*) && @annotation(fileLog)", throwing = "e")
public void addExceptionLog(JoinPoint jp, FileLog fileLog, Exception e) {
System.out.println("异常通知-->");
// 把错误信息写到错误日志文件里面去...
}
}
3.测试
<aop:aspectj-autoproxy/>
<bean class="com.base.yun.spring.aop.LogAspect"/>
<bean id="purchaseService" class="com.base.yun.spring.service.PurchaseService" />
package spring; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.base.yun.spring.service.PurchaseService; public class AopTest { @Test
public void testAop() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("user.xml");
PurchaseService service = ctx.getBean("purchaseService",PurchaseService.class);
service.purchaseProduct("电风扇", 98, "日用品");
} }
测试结果:
环绕通知开始
前置通知-->>
购买商品。。。
环绕通知结束
后置通知-->>
最终通知注解值:记录日志
AOP 实现自定义注解的更多相关文章
- spring AOP 和自定义注解进行身份验证
一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...
- Spring Boot系列——AOP配自定义注解的最佳实践
AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面. ...
- 用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)
目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...
- 【spring boot】SpringBoot初学(6)– aop与自定义注解
前言 github: https://github.com/vergilyn/SpringBootDemo 一.AOP 官方demo:https://github.com/spring-project ...
- 使用AOP获取自定义注解的内容
目录结构: 一:自定义注解 package org.example.annotation; import java.lang.annotation.ElementType; import java.l ...
- springboot通过AOP和自定义注解实现权限校验
自定义注解 PermissionCheck: package com.mgdd.sys.annotation; import java.lang.annotation.*; /** * @author ...
- SpringBoot框架:通过AOP和自定义注解完成druid连接池的动态数据源切换(三)
一.引入依赖 引入数据库连接池的依赖--druid和面向切面编程的依赖--aop,如下所示: <!-- druid --> <dependency> <groupId&g ...
- 基于SpringBoot 、AOP与自定义注解转义字典值
一直以来,前端展示字典一般以中文展示为主,若在表中存字典值中文,当字典表更改字典值对应的中文,会造成数据不一致,为此设置冗余字段并非最优方案,若由前端自己写死转义,不够灵活,若在业务代码转义,臃肿也不 ...
- 利用Spring AOP和自定义注解实现日志功能
Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...
随机推荐
- Fiddler抓取https数据包
Wireshark和Fiddler的优缺点: ①Wireshark是一种在网络层上工作的抓包工具,不仅自带大量的协议分析器,而且可以通过编写Wireshark插件来识别自定义的协议.虽然Wiresha ...
- DRF之视图和router
1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...
- bzoj2875
题意:\(x_{i+1}=(x_{i}*a+c)%m\)求,x_n%g 题解:\(x_n=(a^n*x_0+(a^{n-1}+a^{n-2}+...+a+1)*c)%m\),由于a-1和m不一定互质, ...
- P4238 【模板】多项式求逆 ntt
题意:求多项式的逆 题解:多项式最高次项叫度deg,假设我们对于多项式\(A(x)*B(x)\equiv 1\),已知A,求B 假设度为n-1,\(A(x)*B(x)\equiv 1(mod x^{\ ...
- 如何在VMware系统中的ubuntu16.04中建立与win7系统的共享文件夹
点击虚拟机设置一次得到如图所示 系统默认放在了 /mnt/hgfs文件夹 点击虚拟机安装vmware tools 解压vmware tools压缩包 运行sudo ./vmware-install.p ...
- 在react+redux+axios项目中使用async/await
Async/Await Async/Await是尚未正式公布的ES7标准新特性.简而言之,就是让你以同步方法的思维编写异步代码.对于前端,异步任务代码的编写经历了 callback 到现在流行的 Pr ...
- 理解JS中的this的指向
原文地址:https://www.cnblogs.com/pssp/p/5216085.html#1 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到 ...
- Leetcode 1029. 可被 5 整除的二进制前缀
1029. 可被 5 整除的二进制前缀 显示英文描述 我的提交返回竞赛 用户通过次数467 用户尝试次数662 通过次数477 提交次数1964 题目难度Easy 给定由若干 0 和 1 组成的 ...
- UI界面按钮增强
(我是菜鸟,知道的少) 1.有HTML页面代码的,可以编辑 <%@page language="abap" %> <%@extension name=" ...
- Shiro集成web环境[Springboot]-基础使用
Shiro集成web环境[Springboot] 1.shiro官网查找依赖的jar,其中shiro-ehcache做授权缓存时使用,另外还需要导入ehcache的jar包 <dependenc ...