前提
导入aop需要的jar:
aspectjweaver.jar和aspectjrt.jar和cglib-nodep-2.1_3.jar

加入aop需要的命名空间:

xmlns:aop="http://www.springframework.org/schema/aop"http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd

spring提供了两种切面使用方式:

基于注解方式和基于xml方式。

基于注解方式进行AOP开发

前提:

前面加上aop声明
打开@Aspect的支持:<aop:aspectj-autoproxy/>

<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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:component-scan base-package="cn.itcast"/><aop:aspectj-autoproxy/>

一些有关注解:

@Aspect  声明切面,作用在类上

@Pointcut 声明切入点

例子:

@Pointcut("execution (* cn.itcast.service.impl.PersonServiceBean.*(..))")private void anyMethod(){}//声明一个切入点,采用方法定义的形式

注意点:

  1、切入点的声明和方法类似,但是切入点的名称为方法名+(),比如上面的切入点名为anyMethod()

  2、切入点的扫描内容格式基本固定:execution(切入点表达式)

  切入点表达式:

    分解: 返回值类型  包名.类名.方法名(方法参数)

    可用的符号:

      * 通配符,表示任意

      .. 两种意义,一个表示可变参,在参数列表中使用,一个表示:该包下的子包和该包,在package中使用

      !非

  切入点表达式例子:

返回值是String类型的:

execute(java.lang.String cn.itcast.service..*.*(..))

要求输入参数的第一个参数是String类型:

execute(* cn.itcast.service..*.*(java.lang.String,..))

要求返回值不是void:

execute(!void cn.itcast.service..*.*(..))

通知作用在方法上

@Before 前置通知

@Before("anyMethod()")

如果希望得到拦截到的切入点中的参数,可以这样:

@Before(value="anyMethod() && args(name)")
public void doBefore(String name){//前置通知,里面的参数为切入点名System.out.println("前置通知"+name);
}

@AfterReturning  后置通知

@AfterReturning("anyMethod()") 

如果希望在后置通知中得到方法的返回值:

@AfterReturning(pointcut="anyMethod()",returning="result")
public void doAfterReturning(String result){System.out.println("后置通知"+result);
}

@After 最终通知

@After("anyMethod()")
public void doAfter(){
S  ystem.out.println("最终通知");
}

@AfterThrowing 例外通知

@AfterThrowing("anyMethod()")

如果希望例外通知中得到异常信息:

@AfterThrowing(pointcut="anyMethod()",throwing="e")
public void doAfterThrowing(Exception e){
System.out.println("例外通知"+e);
}

@Around 环绕通知

@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp)throws Throwable{Object result=null;if(true){//判断用户是否有权限System.out.println("进入方法");result=pjp.proceed();//这个方法类似于doFilterSystem.out.println("退出方法");}return result;
}

注意:

  1、环绕通知的作用方法的格式是不变的,只有方法名和参数名可变

  2、环绕通知跟struts2中的拦截器很相似。ProceedingJoinPoint对象的proceed()方法和invocation.invoke()方法类似

基于xml形式进行AOP开发

我们原来的切面变成了普通的java类:

package cn.itcast.service;import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;@Component("aspectBean")
public class MyInterceptor {public void doBefore(){//前置通知System.out.println("前置通知");}public void doAfterReturning(String result){System.out.println("后置通知"+result);}public void doAfter(){System.out.println("最终通知");}public void doAfterThrowing(Exception e){System.out.println("例外通知"+e);}public Object doBasicProfiling(ProceedingJoinPoint pjp)throws Throwable{Object result=null;if(true){//判断用户是否有权限System.out.println("进入方法");result=pjp.proceed();//这个方法类似于doFilterSystem.out.println("退出方法");}return result;}}

View Code

beans.xml的对应配置:

      <aop:config><aop:aspect id="asp" ref="aspectBean"><aop:pointcut id="mycut" expression="execution(* cn.itcast.service.impl..*.*(..))"/><aop:before method="doBefore" pointcut-ref="mycut"/> <aop:after-returning method="doAfterReturning" pointcut-ref="mycut" returning="result"/><aop:after method="doAfter" pointcut-ref="mycut"/><aop:after-throwing method="doAfterThrowing" pointcut-ref="mycut" throwing="e"/><aop:around method="doBasicProfiling" pointcut-ref="mycut"/></aop:aspect></aop:config>

前置通知的参数获取使用xml配置的我没有弄出来,不转牛角尖了,知道的可以告诉下,谢谢!

spring AOP编程相关推荐

  1. java元婴期(20)----java进阶(spring(4)---spring aop编程(全自动)AspectJ)

    spring aop编程:全自动[掌握] 从spring容器获得目标类,如果配置aop,spring将自动生成代理. 要确定目标类,aspectj 切入点表达式,导入jar包(maven项目直接导入相 ...

  2. 从面向对象设计思想出发理解Spring AOP编程

    都说AOP是OOP(面向对象)的继承与延续,我觉得理解AOP还是得从OOP出发,经历从暴露问题到解决问题的过程. 目录 一. 面向对象设计思想(OOP) (1)概述 1. POP编程 2. OOP的优 ...

  3. Spring 5 中文解析之核心篇-Spring AOP编程

    技术交流群: 面向切面的编程(AOP)通过提供另一种思考程序结构的方式来补充面向对像的编程(OOP).OOP中模块化的关键单元是类,而在AOP中模块化是切面.切面使关注点(例如事务管理)的模块化可以跨 ...

  4. Spring AOP编程问题:下面代码哪里错了?可以考验对Spring AOP的实现机制是否了解的

    引言 刚刚开始学Spring AOP,按照教程配置好之后,可以像正常方法那样执行,却怎么也不会执行切面的方法.去群里问了一下,结果也没有解决.然后自己慢慢的试,终于发现了原因. 下面是一段有问题的代码 ...

  5. Spring AOP编程-aspectJ注解开发

    1.编写目标 public interface ICustomerService {public void save();public void search();public int update( ...

  6. Spring AOP编程-aspectJ代理方式选择

    1.在spring的aop开发中,它使用的是代理方案,代理实现有两种: 1)jdk的proxy 2)cglib spring框架默认情况下,会对有接口的类使用proxy代理.没有接口的类使用cglib ...

  7. Spring AOP编程-aspectJ通知类型-6大通知

    1.创建目标类(target) public interface IUserService {public void add();public void update();public String ...

  8. Spring AOP编程-传统基于aspectJ切点AOP开发

    1.在配置文件上方增加aop相关配置. 2.在spring的配置文件中定义目标与通知. 3.使用aop:xxx标签来完成切面与切点声明. 4.我们使用aspectj的切面声明方式 需要在导入aspec ...

  9. Spring AOP编程-传统AOP开发切点表达式写法介绍

    关于execution的常用语法: 1. execution(public * *()) 所有的public的方法 2. execution(* cn.nwtxxb.aop.*(..)) 所有的aop ...

最新文章

  1. iOS彩票项目--第三天,搭建竞技场和发现,搭建幸运选号和我的彩票界面
  2. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | dex_file.cc 中创建 DexFile 实例对象的相关函数分析 )
  3. 【网址收藏】k8s HPA自动伸缩异常:failed to get cpu utilization: missing request
  4. php odbc 分页,用php实现odbc数据分页显示一例_php技巧
  5. 悬浮球不用权限_英山高效纤维球【多佳净水材料】
  6. 计算机网络信息安全理论与实践教程-蒋建春
  7. Android前后端交互细节--Json转化为对象的原理
  8. 3,进程间通信IPC机制,线程,线程通信,互斥锁
  9. Java并发编程-线程安全基础
  10. 剑指offer(数值的整数次方)
  11. 都昌信息袁永福:利用电子病历赋能框架,为健康医疗大数据打好基础【电子病历和健康医疗大数据系列】...
  12. 轻松搞懂Linux中程序、进程、服务的区别及操作命令
  13. 1000道最新大厂高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构
  14. 阿里云返回的视频截图问题
  15. STM32驱动12bit AD TLC2543(I/O模拟方式)
  16. 如何配置DAVINCI内存
  17. Flashback Oracle文档阅读
  18. 谈谈国产FPGA现状
  19. Building Loosely Coupled and Scalable RESTful Services using Orleans
  20. java计算机毕业设计精准扶贫管理系统源码+数据库+lw文档+系统

热门文章

  1. Java使用AES加密解密
  2. Windows Server 2008 R2模板机制作(VMware Workstation)
  3. 告警系统邮件引擎、运行告警系统
  4. Java Date Time 教程-java.sql.Timestamp
  5. 透露|Java学习的最后一点小秘密
  6. [C/CPP系列知识] Type difference of character literals 和 bool in C and C++
  7. H3C S5500核心交换机策略路由调度流量到不同的路由设备
  8. 计算机原理综合设计实验报告,计算机组成原理--课程设计实验报告.doc
  9. 风行未来oracle,oracle 7月份更新CVE-2020-14645 复现&利用
  10. Eclipse juno 中安装 JBoss Tools,集成Hibernate