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 ...
随机推荐
- JS 获得节点
var ele = ev.parentNode; var elem_child = ele.childNodes; in elem_child) { //遍历子元素数组 if (elem_child[ ...
- JS实现随机颜色的3种方法与颜色格式的转化
JS实现随机颜色的3种方法与颜色格式的转化 随机颜色和颜色格式是我们在开发中经常要用到的一个小功能,网上相关的资料也很多,想着有必要总结一下自己的经验.所以这篇文章主要介绍了JS实现随机颜色的3种 ...
- day07补充-数据类型总结及拷贝
目录 数据类型总结 按照存一个值 OR 多个值来分 按照有序 OR 无序来分 按照可变 OR 不可变来分 拷贝 && 浅拷贝 && 深拷贝&& .cop ...
- javascript模块化编程(一)(http://www.ruanyifeng.com/blog/2012/10/javascript_module.html)
Javascript模块化编程(一):模块的写法 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个 ...
- ImageMagick的下载和配置
2. 新建一个VC++的工程,项目->属性 VC++目录中 包含目录中加入4项,ImageMagick安装路径下的include文件夹,和include里边的三个文件夹. 库目录中加入1项,Im ...
- 数字化婚姻配对尝试问题(C++实现)
问题描述:一.标题: 数字化婚姻配对尝试 二.题目: 建立一个模型,来模拟推导社会男女择偶过程. 为了模型简化,一个人的特性指标有三个,这里假设为财富.样貌.品格,每个指标均可取值1-100之间任意数 ...
- chrony配置介绍
rhel7 文档https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Adminis ...
- python爬虫18 | 就算你被封了也能继续爬,使用IP代理池伪装你的IP地址,让IP飘一会
我们上次说了伪装头部 ↓ python爬虫17 | 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部 让自己的 python 爬虫假装是浏览器 小帅b主要是想让你知道 在爬取网站的时候 ...
- 【CodeCraft-19 and Codeforces Round #537 (Div. 2) C】Creative Snap
[链接] 我是链接,点我呀:) [题意] 横坐标1..2^n对应着2^n个复仇者的基地,上面有k个复仇者(位置依次给出). 你是灭霸你要用以下方法消灭这k个复仇者: 一开始你获取整个区间[1..2^n ...
- 清北学堂模拟赛d6t2 刀塔
分析:看到最小值最大就很显然是二分了吧,二分一下最小值,把小于它的数给删掉,然后看每个数向左边能延伸多长,往右边能延伸多长,最后统计一下有没有可行答案就可以了. #include <cstdio ...