Spring的通知类型,切入表达式写法
转载自 https://www.cnblogs.com/ltfxy/p/9882697.html
Spring中通知类型:
- 前置通知:目标方法执行之前进行操作,可以获得切入点信息
- 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值
- 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方法的执行
- 异常抛出通知:在程序出现异常的时候进行的操作,可以返回异常信息
- 最终通知:无论代码是否有异常,总是执行,相当于finally
- 引介通知(了解即可):
切面类:
配置:
测试结果:
环绕通知:目标方法执行之前和之后进行操作(事务管理),可以阻止目标方法的执行
异常抛出通知:程序出现异常的时候进行的操作
最终通知:无论代码是否有异常,总是会执行
引介通知:(了解)
applictionContext.xml
![](https://common.cnblogs.com/images/copycode.gif)
<?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: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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置目标对象(被增强对象) -->
<bean id="productDao" class="com.spring4.demo3.ProductDaoImpl"></bean> <!-- 将切面类交给Spring管理 -->
<bean id="myAspect" class="com.spring4.demo3.MyAspectXML"> </bean> <!-- 通过Spring配置对目标类完成代理 -->
<aop:config> <!-- 配置切入点,表达式配置哪些类的哪些方法需要进行增强,*代表任意返回值,...代表任意参数 -->
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.save(..))"
id="pointcut1" />
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.delete(..))"
id="pointcut2" />
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.update(..))"
id="pointcut3" />
<aop:pointcut expression="execution(* com.spring4.demo3.ProductDaoImpl.find(..))"
id="pointcut4" /> <!-- 配置切面 -->
<aop:aspect ref="myAspect"> <!-- 配置前置增强 -->
<aop:before method="checkPri" pointcut-ref="pointcut1" />
<!-- 配置后置增强,设置返回值为result -->
<aop:after-returning method="log4j" pointcut-ref="pointcut2" returning="result" />
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="pointcut3"/>
<!-- 异常抛出通知,设置异常信息为ex -->
<aop:after-throwing method="afterThtowing" pointcut-ref="pointcut4" throwing="ex"/>
<!-- 最终通知 -->
<aop:after method="after" pointcut-ref="pointcut4"/> </aop:aspect> </aop:config> </beans>
![](https://common.cnblogs.com/images/copycode.gif)
Java
![](https://common.cnblogs.com/images/copycode.gif)
1 package com.itheima.spring.demo3;
2
3 public class ProductDaoImpl implements ProductDao {
4
5 @Override
6 public void save() {
7 System.out.println("保存商品");
8 }
9 @Override
10 public void update() {
11 System.out.println("修改商品");
12 }
13 @Override
14 public void find() {
15 System.out.println("查找商品");
16 // int i = 1/0;
17 }
18 @Override
19 public String delete() {
20 System.out.println("删除商品");
21 return "赵洪";
22
23 }
24
25 }
26
27
28 package com.itheima.spring.demo3;
29
30 import org.aspectj.lang.ProceedingJoinPoint;
31
32 /**
33 * 切面:切入点和通知的组合
34 * @author 李腾
35 */
36 public class MyAspectXml {
37 /**
38 * 前置通知
39 * @param joinpoint
40 */
41 public void checkPri(){
42 System.out.println("权限校验=======");
43 }
44 /**
45 * 后置通知
46 */
47 public void writeLog(Object result){
48 System.out.println("日志记录======"+result);
49 }
50 /**
51 * 环绕通知
52 * @throws Throwable
53 */
54 public Object aruond(ProceedingJoinPoint joinPoint) throws Throwable{
55 System.out.println("环绕通知=======");
56 Object obj = joinPoint.proceed();
57 System.out.println("环绕通知=======");
58 return obj;
59 }
60 /**
61 * 异常抛出通知
62 */
63 public void afterThrowing(Throwable ex){
64 System.out.println("异常抛出通知"+ex.getMessage());
65 }
66 /**
67 * 最终通知: 相当于finally代码块
68 */
69 public void after(){
70 System.out.println("最终通知=====");
71 }
72 }
73
74
75 package com.itheima.spring.demo3;
76 import javax.annotation.Resource;
77
78 import org.junit.Test;
79 import org.junit.runner.RunWith;
80 import org.springframework.test.context.ContextConfiguration;
81 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
82 /**
83 *测试类
84 */
85 @RunWith(SpringJUnit4ClassRunner.class)
86 @ContextConfiguration("classpath:applicationContext.xml")
87 public class SpringDemo3 {
88
89 @Resource(name="productDao")
90 private ProductDao productDao;
91 @Test
92 public void demo1(){
93 productDao.save();
94 productDao.update();
95 productDao.delete();
96 productDao.find();
97
98 }
99 }
![](https://common.cnblogs.com/images/copycode.gif)
切入点表达式语法:基于execution函数完成的
Spring的通知类型,切入表达式写法的更多相关文章
- 十三 Spring的通知类型,切入表达式写法
Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方 ...
- spring quartz 的定时器cronExpression表达式写法(转载)
转载来源:https://zhidao.baidu.com/question/240797777248343764.html====================================== ...
- JAVA框架 Spring AOP--切入点表达式和通知类型
一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...
- 分享知识-快乐自己:Spring切入点的表达式和通知类型
1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...
- 7.Spring切入点的表达式和通知类型
1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...
- Java开发学习(十六)----AOP切入点表达式及五种通知类型解析
一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...
- Spring AOP使用整理:各种通知类型的介绍
2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; p ...
- spring.net AOP通知类型
上篇介绍了spring.net AOP的基本实现,其中有说到通知类型,首先在这里补充解释一下.最后出一个异常通知的实例,因为他的实现和别的通知有些不一样. 1.拦截环绕通知:在Spring中最基础的通 ...
- spring aop的五种通知类型
昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...
随机推荐
- c++Volatile关键词
看到的一篇文章觉得还不错吧,文章具体位置也找不到了,复制一下,留着日后复习 背景 此微博,引发了朋友们的大量讨论:赞同者有之:批评者有之:当然,更多的朋友,是希望我能更详细的解读C/C++ Volat ...
- 启动sql2012时出现Cannot find one or more components.Please reinstall the application
①在运行中输入regedit.exe,启动注册表工具 ②找到注册表中的此处路径“HKEY_CURRENT_USER\Software\Microsoft\SQL Server Management S ...
- Failed at the @ watch script 'cross-env NODE_ENV=development 使用cross-env解决跨平台设置NODE_ENV的问题
今天在安装js依赖包时,根目录的package.json: { "private": true, "scripts": { "dev": & ...
- 三个线程T1,T2,T3.保证顺序执行的三种方法
经常看见面试题:有三个线程T1,T2,T3,有什么方法可以确保它们按顺序执行.今天手写测试了一下,下面贴出目前想到的3种实现方式 说明:这里在线程中我都用到了sleep方法,目的是更容易发现问题.之前 ...
- js实现ctrl+v上传图片
描述:实现类似QQ截图删上传图片的功能 a.需要的js插件 paste.image.js 地址:https://github.com/iyangyuan/pasteimg b.paste.image. ...
- SpringBoot中异步请求和异步调用(看这一篇就够了)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...
- Hibernate入门(八)级联保存或更新(含问题在末尾,求大佬指点..)
级联保存或更新CASCADE 级联保存或更新: 作用就是:保存一方的数据的时候,会把关联的对象也同时保存. 级联保存或更新的配置: 属性名:cascade 属性值: 1.none:所有情况下均不进行关 ...
- 当前主流电脑的BIOS调出键
[组装电脑主板] 主板品牌 启动按键 华硕主板 F8 技嘉主板 F12 微星主板 F11 映泰主板 F9 梅捷主板 ESC或F12 七彩虹主板 ESC或F11 华擎主板 F11 斯巴达 ...
- ecstore Fatal error: Class 'base_request' not found
1.首次安装已存在的ecstore报错: Fatal error: Class 'base_request' not found 报错效果图:(ecstore 乱码需要安装zend guard loa ...
- 【20190220】JavaScript-知识点整理:对象创建方式、原型、闭包
一.对象创建方式 1. 工厂模式 这种模式抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节.存在的问题是无法通过 instanceof 识别一个对象的类型. function creat ...