转载自  https://www.cnblogs.com/ltfxy/p/9882697.html

Spring中通知类型:

  • 前置通知:目标方法执行之前进行操作,可以获得切入点信息        
  • 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值
  • 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方法的执行
  • 异常抛出通知:在程序出现异常的时候进行的操作,可以返回异常信息
  • 最终通知:无论代码是否有异常,总是执行,相当于finally
  • 引介通知(了解即可):

切面类:

配置:

测试结果:

环绕通知:目标方法执行之前和之后进行操作(事务管理),可以阻止目标方法的执行

异常抛出通知:程序出现异常的时候进行的操作

最终通知:无论代码是否有异常,总是会执行

引介通知:(了解)

 applictionContext.xml

<?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>

Java

 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 }

切入点表达式语法:基于execution函数完成的

Spring的通知类型,切入表达式写法的更多相关文章

  1. 十三 Spring的通知类型,切入表达式写法

    Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方 ...

  2. spring quartz 的定时器cronExpression表达式写法(转载)

    转载来源:https://zhidao.baidu.com/question/240797777248343764.html====================================== ...

  3. JAVA框架 Spring AOP--切入点表达式和通知类型

    一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...

  4. 分享知识-快乐自己:Spring切入点的表达式和通知类型

    1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...

  5. 7.Spring切入点的表达式和通知类型

    1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...

  6. Java开发学习(十六)----AOP切入点表达式及五种通知类型解析

    一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...

  7. Spring AOP使用整理:各种通知类型的介绍

    2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; p ...

  8. spring.net AOP通知类型

    上篇介绍了spring.net AOP的基本实现,其中有说到通知类型,首先在这里补充解释一下.最后出一个异常通知的实例,因为他的实现和别的通知有些不一样. 1.拦截环绕通知:在Spring中最基础的通 ...

  9. spring aop的五种通知类型

    昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...

随机推荐

  1. 第一册:lesson5-6.

    原文: A:Good morning. B:Good morning,Mr.A. A:This is Miss C. C is a new student.She is Frech. C ,this ...

  2. C#爬虫----Fiddler 插件开发 自动生成代码

    哈喽^_^ 一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成封包代码就尤为重要了( ...

  3. 大家好,又是新的一天。今天给大家带来一些新的知识:选择器的种类和css的三种样式

    今天我们为大家 选择了 六种 选择器: 1. 标签选择器 2.id选择器 3.class选择器 4.后代选择器 5.子代选择器 6.交集选择器 我们就举三个典型的例子:后代选择器,子代选择器和交集选择 ...

  4. CDRAF之Service mesh

    最近翻看一些网上的文章,偶然发现我们的CDRAF其实就是Service mesh的C++版本.不管从架构的理念上,或者功能的支持上面,基本完全符合.发几个简单的文章链接,等有时间的时候,再来详细描述. ...

  5. 6.方法_EJ

    第38条: 检查参数的有效性 对于这一条,最常见的莫过于检查参数是否为null. 有时出现调用方未检查传入的参数是否为空,同时被调用方也没有检查参数是否为空,结果这就导致两边都没检查以至于出现null ...

  6. idea输入法不跟随解决办法

    最近使用idea开发项目,遇到输入法不跟随的问题,自己动手解决了下 idea输入法不跟随解决办法: 1):系统:windows10 版本:idea2017.2 解决办法:使用QQ输入法 2):系统:w ...

  7. C# 动态添加类、动态添加类型、代码添加类型

    引用控件: DLL下载地址:http://pan.baidu.com/s/1nv2GUWL public class TypeCreator { public static Type Creator( ...

  8. bootstrap table 获取数据后的前台页面(后台怎么传就不必详细说明了吧)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...

  9. select2 插件编辑时设置默认值

    function htDate(selectCustomerId, val) { var customerId = selectCustomerId; var values = val; ajaxJs ...

  10. Django---ORM中的锁和事务

    ---恢复内容开始--- 一 锁 行级锁 select_for_update(nowait=False,skip_locked=False)  #注意必须用在事务里面,至于如何开启事务,往后看 返回一 ...