SpringAOP使用注解实现5种通知类型
spring aop的5种通知类型都有
Before前置通知
AfterReturning后置通知
Around环绕通知
AfterThrowing异常通知
After最终通知
首先创建接口和实现类 先测试后置通知
package com.aaa.spring.dao;
public interface UserService {
public void insertUser();
public void updateUser();
public void deleteUser();
public void find();
}
package com.aaa.spring.dao.umpl; import com.aaa.spring.dao.UserService;
import com.aaa.spring.exception.MyException;
import org.springframework.stereotype.Component; @Component(创建userServiceImpl bean)
public class UserServiceImpl implements UserService {
@Override
public void insertUser() {
System.out.println("添加用户");
} @Override
public void updateUser() {
System.out.println("修改用户");
} @Override
public void deleteUser() {
System.out.println("删除用户");
} @Override
public void find() {
System.out.println("查询用户");
}
}
创建要在执行的方法前后的类
package com.aaa.spring.advice; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component(获取bean对象)
@Aspect(面向切面)
public class LogAdvice {
@AfterReturning("execution(void *User(..))")(后置通知(切入点))
public void log(JoinPoint jp){ (JoinPoint 连接点参数)
String name=jp.getSignature().getName();(获取拦截的方法名)
System.out.println(name+"执行之后记录成功");
}
}
创建ApplicationContext文件
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org
/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework
.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework
.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.aaa.spring"></context:component-scan>(扫描创建bean的包就是加@Component的类的所有包)
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>(声明以注解的方式配置spring aop)
</beans>
创建测试类
package com.aaa.spring.text; import com.aaa.spring.dao.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Text {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationcontext.xml");(获取主配置文件)
UserService bean = (UserService)context.getBean("userServiceImpl");(获取实现类对象)
bean.deleteUser();
System.out.println("*****************************");
bean.find();
System.out.println("*****************************");
bean.insertUser();
System.out.println("*****************************");
bean.updateUser(); }
}
测试结果
五月 20, 2019 9:01:24 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:01:24 CST 2019]; root of context hierarchy
五月 20, 2019 9:01:24 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
删除用户
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
添加用户
insertUser执行之后记录成功
*****************************
修改用户
updateUser执行之后记录成功 Process finished with exit code 0
前置通知
只需要在LogAdvice 类里边再加方法
package com.aaa.spring.advice; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
@AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
}
测试结果
五月 20, 2019 9:08:07 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:08:07 CST 2019]; root of context hierarchy
五月 20, 2019 9:08:08 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
deleteUser执行之前记录成功
删除用户
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
insertUser执行之前记录成功
添加用户
insertUser执行之后记录成功
*****************************
updateUser执行之前记录成功
修改用户
updateUser执行之后记录成功 Process finished with exit code 0
环绕通知
只需要在LogAdvice 类里边再加方法
package com.aaa.spring.advice; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
@AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp){
String name=pjp.getSignature().getName();
System.out.println(name+"环绕执行前");
try {
pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(name+"环绕后执行");
} }
测试结果
五月 20, 2019 9:10:12 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:10:12 CST 2019]; root of context hierarchy
五月 20, 2019 9:10:12 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
deleteUser环绕执行前
deleteUser执行之前记录成功
删除用户
deleteUser环绕后执行
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
insertUser环绕执行前
insertUser执行之前记录成功
添加用户
insertUser环绕后执行
insertUser执行之后记录成功
*****************************
updateUser环绕执行前
updateUser执行之前记录成功
修改用户
updateUser环绕后执行
updateUser执行之后记录成功 Process finished with exit code 0
最终通知
只需要在LogAdvice 类里边再加方法
package com.aaa.spring.advice; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
@AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp){
String name=pjp.getSignature().getName();
System.out.println(name+"环绕执行前");
try {
pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(name+"环绕后执行");
}
@After("execution(void *User(..))")
public void after(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"最终执行记录成功");
} }
测试结果
五月 20, 2019 9:12:00 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:12:00 CST 2019]; root of context hierarchy
五月 20, 2019 9:12:00 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
deleteUser环绕执行前
deleteUser执行之前记录成功
删除用户
deleteUser环绕后执行
deleteUser最终执行记录成功
deleteUser执行之后记录成功
*****************************
查询用户
*****************************
insertUser环绕执行前
insertUser执行之前记录成功
添加用户
insertUser环绕后执行
insertUser最终执行记录成功
insertUser执行之后记录成功
*****************************
updateUser环绕执行前
updateUser执行之前记录成功
修改用户
updateUser环绕后执行
updateUser最终执行记录成功
updateUser执行之后记录成功 Process finished with exit code 0
异常通知,这里我们自定义一个异常
先创建一个异常类继承RuntimeException程序异常
package com.aaa.spring.exception;
public class MyException extends RuntimeException{
public MyException(String yc){
super(yc);
}
}
然后在LogAdvice 类里添加方法这里为了方便测试把上面的都加上了注释
package com.aaa.spring.advice; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler; @Component
@Aspect
public class LogAdvice {
/* @AfterReturning("execution(void *User(..))")
public void log(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之后记录成功");
}
@Before("execution(void *User(..))")
public void befor(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"执行之前记录成功");
}
@Around("execution(void *User(..))")
public void around(ProceedingJoinPoint pjp){
String name=pjp.getSignature().getName();
System.out.println(name+"环绕执行前");
try {
pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(name+"环绕后执行");
}
@After("execution(void *User(..))")
public void after(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"最终执行记录成功");
}*/
@AfterThrowing(pointcut = "execution(void *User(..))")
public void excaption(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println("执行"+name+"时发生异常");
}
}
然后在实现类里抛出异常
package com.aaa.spring.dao.umpl; import com.aaa.spring.dao.UserService;
import com.aaa.spring.exception.MyException;
import org.springframework.stereotype.Component; @Component
public class UserServiceImpl implements UserService {
@Override
public void insertUser() {
if(true){
throw new MyException("自定义异常");
}
System.out.println("添加用户");
} @Override
public void updateUser() {
System.out.println("修改用户");
} @Override
public void deleteUser() {
System.out.println("删除用户");
} @Override
public void find() {
System.out.println("查询用户");
}
}
测试结果
五月 20, 2019 9:18:57 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@68de145: startup date [Mon May 20 21:18:57 CST 2019]; root of context hierarchy
五月 20, 2019 9:18:57 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationcontext.xml]
删除用户
*****************************
查询用户
*****************************
执行insertUser时发生异常
Exception in thread "main" com.aaa.spring.exception.MyException: 自定义异常
at com.aaa.spring.dao.umpl.UserServiceImpl.insertUser(UserServiceImpl.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy7.insertUser(Unknown Source)
at com.aaa.spring.text.Text.main(Text.java:17) Process finished with exit code 1
SpringAOP使用注解实现5种通知类型的更多相关文章
- spring aop 的五种通知类型
本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...
- Java开发学习(十六)----AOP切入点表达式及五种通知类型解析
一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...
- spring aop的五种通知类型
昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...
- 黑马Spring学习 AOP XML和注解配置 5种通知 切点切面通知织入
业务类 package cn.itcast.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoin ...
- 跨平台移动开发_PhoneGap 警告,通知,鸣叫,振动4 种通知类型
创建鸣叫 使用 confirmation.beep 创建鸣叫 function playBeep() { navigator.notification.beep(1); } 创建振动 使用 ...
- AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
https://blog.csdn.net/u010502101/article/details/78823056
- 十五 Spring的AOP的注解的通知类型,切入点的注解
Spring的注解的AOP的通知类型 @Before:前置通知 @AfterReturning:后置通知 @Around:环绕通知 @AfterThrowing:异常抛出通知 @After:最终通知 ...
- SpringAop@Aspect注解实现切面编程
SpringAOP在springboot中如何使用 #什么是aop## 概念> aop全称Aspect OrientedProgramming,面向切面,AOP主要实现的目的是针对业务处理过程中 ...
- 四种常用的通知类型(xml)
1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
随机推荐
- Python之模块、正则
一.模块import 模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,再环境变量里面找导入的模块名字最好不要有.,a.import sysprin ...
- 宏基因组扩增子图表解读2散点图:组间整体差异分析(Beta多样性)
散点图 数据点在直角坐标系平面上的分布图.在宏基因组领域,散点图常用于展示样品组间的Beta多样性,常用的分析方法有主成分分析(PCA),主坐标轴分析(PCoA/MDS)和限制条件的主坐标轴分析(CP ...
- SpringMVC知识点总结一(非注解方式的处理器与映射器配置方法)
一.SpringMVC处理请求原理图(参见以前博客) 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用HandlerMappi ...
- 企业级mysql数据库完全备份、增量备份脚本
企业完全备份脚本 [root@client ~]# vim /opt/mysql_bak_wanbei.sh #!/bin/bash #MySQL数据库完全备份脚本 #设置登录变量 MY_USER=& ...
- ModelBinder 请求容错性
代码 //using System.Web.Mvc; public class TrimToDBCModelBinder : DefaultModelBinder { public override ...
- JavaScript day4(逻辑运算符)
逻辑运算符 逻辑运算符用于测定变量或值之间的逻辑 逻辑与运算符:&&.同时满足(and). 通过if语句的嵌套来实现: if (num > 5) { if (num < 1 ...
- 计蒜客 疑似病毒 (AC自动机 + 可达矩阵)
链接 : Here! 背景 : 开始我同学是用 AC自动机 + DP 的方法来做这道题, 这道题的标签是 AC自动机, 动态规划, 矩阵, 按道理来说 AC自动机 + DP 应该是能过的, 但是他不幸 ...
- hdu2011 多项式求和【C++】
多项式求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- PKI 的组成
PKI(Public Key Infrastructure)公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书.一个机构通过采用PKI 框架管理密钥和证书可以建立一个安全的 ...
- Java基础学习总结(70)——开发Java项目常用的工具汇总
要想全面了解java开发工具,我们首先需要先了解一下java程序的开发过程,通过这个过程我们能够了解到java开发都需要用到那些工具. 首先我们先了解完整项目开发过程,如图所示: 从上图中我们能看到一 ...