学习内容

Spring AOP 切面的定义


Spring AOP定义切面有多种方式,例如

1、使用@AspectJ注解

2、使用<aop:aspect>标签

3、使用<aop:advisor>标签

4、使用Advisor类


一、使用@AspectJ注解

a、在配置文件中加<aop:aspectj-autoproxy>

b、编写切面类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import java.util.Arrays;@Component
@Aspect
public class LogAspect {private final String POINT_CUT = "execution(public * com.congrong.service.*.*(..))";@Pointcut(POINT_CUT)public void pointCut(){}/*** 切点方法之前执行* @param joinPoint*/@Before(value = "pointCut()")public void before(JoinPoint joinPoint){ System.out.println("@Before通知执行"); }/*** 切点方法之后执行* @param joinPoint*/@After(value = POINT_CUT)public void doAfterAdvice(JoinPoint joinPoint){System.out.println("After通知执行");}/*** 切点方法返回后执行* 如果第一个参数为JoinPoint,则第二个参数为返回值的信息* 如果第一个参数不为JoinPoint,则第一个参数为returning中对应的参数* returning:限定了只有目标方法返回值与通知方法参数类型匹配时才能执行后置返回通知,否则不执行,* 参数为Object类型将匹配任何目标返回值* @param joinPoint* @param result*/@AfterReturning(value = POINT_CUT,returning = "result")public void doAfterReturningAdvice(JoinPoint joinPoint,Object result){System.out.println("AfterReturning通知执行");}/*** 切点方法抛异常执行* 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法;* throwing:限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行,* 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。* @param joinPoint* @param exception*/@AfterThrowing(value = POINT_CUT,throwing = "exception")public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){System.out.println("AfterThrowing通知执行");if(exception instanceof NullPointerException){System.out.println("NullPointerException!");}}/*** 环绕通知:* Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用* 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。* 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型* @param proceedingJoinPoint* @return*/@Around(value = POINT_CUT)public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){System.out.println("@Around环绕通知开始执行");Object obj = null;try {obj = proceedingJoinPoint.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}System.out.println("@Around环绕通知结束执行");return obj;
}}

二、使用<aop:aspect>标签

<!-- 定义目标对象 -->
<bean name="userDao" class="com.congrong.dao.UserDaoImpl" /><!-- 定义切面 -->
<bean name="logAspect" class="com.congrong.LogAspect" /><!-- 配置AOP -->
<aop:config><!-- 定义切点函数 -->
<aop:pointcut id="pointcut" expression="execution(* com.congrong.dao.*.*(..))" /><!-- 配置切面-->
<aop:aspect ref="logAspect"><!-- 前置通知method 指定通知方法名,必须与logAspect中的相同pointcut 指定切点函数--><aop:before method="before" pointcut-ref="pointcut" /><!-- 返回通知 returning="returnVal" 定义返回值 必须与类中声明的名称一样--><aop:after-returning method="afterReturn"pointcut-ref="pointcut" returning="returnVal" /><!-- 环绕通知 --><aop:around method="around" pointcut-ref="pointcut" /><!--异常通知 throwing="throwable" 指定异常通知错误信息变量,必须与类中声明的名称一样--><aop:after-throwing method="afterThrowing"pointcut-ref="pointcut" throwing="throwable"/><!--后置/最终通知 --><aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect></aop:config>

三、使用<aop:advisor>标签

与< aop:aspect>定义切面时不同的是,< aop:aspect>的通知只需要定义一般的bean就行,而

< aop:advisor>中引用的通知,必须实现Advice接口。

定义通知

//定义通知
public class LogAdvice implements MethodBeforeAdvice,AfterReturningAdvice{@Override
public void before(Method arg0, Object[] arg1, Object arg2)throws Throwable {System.out.println("开始打印日志!");
}@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable {System.out.println("结束打印日志!");
}}

配置


<bean id="logAdvice" class="com.congrong.LogAdvice"></bean><aop:config><aop:pointcut id="pointcut" expression="execution(* com.congrong.*.*(..))"/><aop:advisor advice-ref="logAdvice" pointcut-ref="pointcut"/>
</aop:config>

四、使用Advisor类

//定义一个接口
public interface UserDao {void addUser();
}
//目标对象实现接口并重写方法
public class UserDaoImpl implements UserDao {@Override
public void addUser() {System.out.println("新增用户");
}}
//实现增强类的接口
public class LogBefore implements MethodBeforeAdvice {//arg0 目标类的方法
arg1 目标类的入参数
arg2 目标类
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {System.out.println("添加日志");
}}

ProxtyFactory以编程形式

public class Test {public static void main(String[] args) throws Exception{LogBefore log = new LogBefore();UserDao userDao = new UserDaoImpl();ProxyFactory proxyf = new ProxyFactory();//设置目标对象
proxyf.setTarget(userDao);//设置增强类对象
proxyf.addAdvice(log);//获得代理对象
UserDao up = proxyf.getProxy();up.addUser();}}

ProxyFactoryBean通过xml配置代理。

<bean id="logBefore" class="com.cong.LogBefore"/><bean id="target" class="com.cong.UserDaoImpl"/><bean id="userDao" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.cong.UserDao"
p:interceptorNames="logBefore"
p:target-ref="target"/>

二、Spring AOP 切面的定义相关推荐

  1. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  2. spring aop 切面添加日志

    这是一个非常简单的spring aop切面添加日志的程序,下面来看一下这个程序 1.程序使用jar包 2.切面类LoggingAspect.java package com.cailei.aop.as ...

  3. Spring AOP 切面@Around注解的具体使用

    @Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务. 比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@ ...

  4. 【经典】Spring aop切面实现异步添加日志—完整版

    系统开发中我们常遇到要处理系统日志等信息的,在此我分享一篇 利用spring aop切面来异步添加日志的操作,其中用到了 队列和多线程,前面的博客有写. 第一步:创建log实体,根据自己业务而定, p ...

  5. spring AOP切面日志

    spring AOP切面日志 导入依赖 <properties><fastjson.version>1.2.49</fastjson.version> </p ...

  6. 实验二 Spring AOP的使用

    目录 实验目的: 实验内容: 一.了解AOP(简介) 相关开发术语: 二.了解aop两种代理方式 三.使用spring AOP代理实现: 1.创建项目,引入相关架包 2.创建目标接口和实现类 3.创建 ...

  7. Spring AOP切面使用详细解析

    相关文章: SpringBoot AOP切面的使用 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析) 架构师系列内容:架构师学习笔记(持续更新)) Spring AOP 应 ...

  8. Spring AOP 切面(Aspect)应用详解

    1. AOP 切面应用 下面是一个AOP切面的一个简单的应用实例 引入AOP依赖 <dependency><groupId>org.springframework.boot&l ...

  9. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

  10. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

最新文章

  1. Android 开源项目及其学习
  2. Spring AOP概述及底层实现原理
  3. 将Html文档整理为规范XML文档
  4. JAVA.Properties了解一下
  5. 【PAT甲级 LinkedHashMap】1041 Be Unique (20 分) Java、C++版
  6. python 安装容易吗,Python安装的步骤操作其实是件很容易的事
  7. python+Django+test 测试数据库生成报错
  8. 稀疏矩阵-sparse 存储和转换
  9. hadoop相关问题-stop-all.sh
  10. 一张图看懂Resnet50与Resnet101算法
  11. 吉大 c语言程序设计 51课 6cd,03MCS51单片机C语言程序设计.ppt
  12. Matlab中textscan函数用法
  13. PHP框架高级编程——应用Symfony、CakePHP和Zend
  14. 《Maven实战》(许晓斌)导读(读书笔记第二次读后感)
  15. Ubuntu如何把主文件夹的中文设置成英文
  16. 关于半岛体试验的一些知识汇总
  17. 蓝桥杯嵌入式解决LCD与LED冲突的方法
  18. 安卓app源码和设计报告——简易记账本
  19. Can only install one of: topthink/think-installer[v2.0.0, v1.0.12].
  20. STM32 ADC单通道与多通道_DMA学习笔记

热门文章

  1. 银行联行号cnasp查询(二)
  2. css 元素上下居中
  3. VS2013下载网址及破解注册码
  4. mindoc mysql_mindoc
  5. 时间序列(数据分析)
  6. Java能和comsol连接吗_安装COMSOL时遇到与Java相关的错误
  7. 【基础知识】【模块介绍】8位8段数码管(74HC595)【硬件部分】
  8. 2020年下半年软件设计师上午真题及答案解析
  9. 微波遥感——微波与大气
  10. wap网站源码 php,DIYWAP免费PHP手机网站管理系统 v6.3