Spring中关于AOP的实践之AspectJ方式实现通知

(本文中如有不当之处,恳请批评指正)

AspectJ方式的简化了通知的出现复杂度。但是对配置文件的操作复杂度有了一定的提升

一. 配置通知

 1 package com.xkx.adviceDemo;
 2
 3 import org.aspectj.lang.ProceedingJoinPoint;
 4
 5 public class TotalAdvice {
 6
 7   public void myBefore(){
 8     System.out.println("aspectj方式:物资准备,人员准备,武器准备");
 9   }
10
11   public void myAfter(){
12     System.out.println("aspectj方式:人员解救成功");
13   }
14
15   public void myError(){
16     System.out.println("解救出现意外情况,任务执行失败");
17   }
18
19   public void myArround(ProceedingJoinPoint p){
20     System.out.println("环绕通知:开始解救,准备物资,准备弹药");
21     try {
22       //放行,执行切点方法
23       Object result=p.proceed();
24     } catch (Throwable throwable) {
25       throwable.printStackTrace();
26     }
27     System.out.println("环绕通知:任务执行成功,人质顺利解救");
28
29   }
30
31   public void myBeforeHasParameter(String name1,int age1){
32     System.out.println("aspectj方式:"+name1+"    "+age1+"物资准备,人员准备,武器准备");
33   }
34
35 }
myBeforeHasParameter是一个带有参数的前置通知,其方法参数名要与配置文件中的对应方法完全一致

二.切点所在类的配置

 1 package com.xkx.pojo;
 2
 3 public class People {
 4   private int age;
 5   private String name;
 6   private String sexual;
 7
 8   public int getAge() {
 9     return age;
10   }
11
12   public void setAge(int age) {
13     this.age = age;
14   }
15
16   public String getName() {
17     return name;
18   }
19
20   public void setName(String name) {
21     this.name = name;
22   }
23
24   public String getSexual() {
25     return sexual;
26   }
27
28   public void setSexual(String sexual) {
29     this.sexual = sexual;
30   }
31
32
33
34   @Override
35   public String toString() {
36     return this.getAge()+"--"+this.getName()+"--"+this.getSexual();
37   }
38
39   public People() {
40   }
41
42   public People(int age, String name, String sexual) {
43     this.age = age;
44     this.name = name;
45     this.sexual = sexual;
46
47   }
48   public void crraped(){
49     System.out.println(this.getName()+"已被绑架");
50   }
51
52   public void show(){
53     System.out.println("切点执行:解救"+this.getName()+"任务");
54   }
55
56   public void show2(String name1,int age1){
57     System.out.println("切点执行:解救"+name1+"-->"+age1+"任务");
58   }
59
60   public void covert(){
61     System.out.println("解救成功,召开新闻发布会");
62   }
63
64
65 }

三. 配置Spring的配置文件:applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4   xmlns:aop="http://www.springframework.org/schema/aop"
 5   xsi:schemaLocation="http://www.springframework.org/schema/beans
 6   http://www.springframework.org/schema/beans/spring-beans.xsd
 7  http://www.springframework.org/schema/aop
 8  http://www.springframework.org/schema/aop/spring-aop.xsd">
 9
10   <bean id="people2" class="com.xkx.pojo.People"></bean>
11   <bean id="myAdvice" class="com.xkx.adviceDemo.TotalAdvice"></bean>
12
13   <aop:config>
14     <aop:aspect ref="myAdvice">
15       <aop:pointcut id="mypeople3" expression="execution(* com.xkx.pojo.People.show2(String,int )) and args(name1,age1)"></aop:pointcut>
16       <aop:before method="myBefore" pointcut-ref="mypeople3" ></aop:before>
17       <aop:before method="myBeforeHasParameter" pointcut-ref="mypeople3" arg-names="name1,age1"></aop:before>
18       <aop:after method="myAfter" pointcut-ref="mypeople3"></aop:after>
19       <aop:after-throwing method="myError" pointcut-ref="mypeople3"></aop:after-throwing>
20       <aop:after-returning method="myAfter" pointcut-ref="mypeople3"></aop:after-returning>
21       <aop:around method="myArround" pointcut-ref="mypeople3" ></aop:around>
22     </aop:aspect>
23   </aop:config>
24 </beans>

注意:args()中的参数名可以随意取,没有限制,但是一旦取好后,标红的通知的arg-names的参数就要与前面命名的完全一致,而通知方法的方法参数也要完全同配置文件中的通知参数名完全一致

最后的测试就不贴代码了。

原文地址:https://www.cnblogs.com/Kaithy-Rookie/p/9783751.html

时间: 2024-10-11 10:17:10

Spring中关于AOP的实践之AspectJ方式实现通知的相关文章

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob

深入分析JavaWeb Item54 -- Spring中的AOP面向切面编程2

一.在Advice方法中获取目标方法的参数 1.获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Object getTarget:返回被织入增强处理的目标对象 Object getThis:返

spring中的AOP 以及各种通知

理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了这个问题,通过 execution表达式 指定哪些包中的那些类 哪些方法 用到事务 execution(public * *(..))  所有的公共方法 execution(* set*(..))  以set开头的任意方法 execution(* com.xyz.service.AccountSer

Java——面向切面编程,Spring中的AOP编程

面向切面编程 AOP思想:将横向重复代码,纵向抽取出来 AOP体现--Filter AOP体现--拦截器 AOP体现--动态代理 Spring中实现AOP思想 原理:Spring可以为容器中管理的对象生成代理对象 代理分为动态代理和cglib代理: 动态代理(优先) 被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术,换句话说,就是代理对象和被代理要实现同一接口 cglib代理 第三方代理技术,cglib代理,可以对任何类生成代理,代理的原理是对目标对象进行继承代理,

2018.12.24 Spring中的aop演示

Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 4.spring中的aop演示 4.1步骤: 1.导包(4+2+2+2+1) 基础包+日志包+aop.aspects+test+weaver+aopalliance 下面两个是spring需要的第三方aop包 com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.or

spring中的aop注解(整合junit测试)

使用spring中的aop前先来了解一下spring中aop中的一些名词 Joimpoint(连接点):目标对象中,所有可能增强的方法 PointCut(切入点):目标对象,已经增强的方法 Advice(通知/增强):增强的代码 Target(目标对象):被代理对象 Weaving(织入):将通知应用到切入点的过程 Proxy(代理):将通知织入到目标对象之后,形成代理对象 aspect(切面):切入点+通知 一:不使用spring的aop注解 以javaEE中的service层为例 UserS

Spring中的AOP

在上一篇博客中,我们讲了Spring的IOC,以下,我们继续解说Spring的还有一个核心AOP AOP: 在软件业,AOP为Aspect Oriented Programming的缩写.意为:面向切面编程,通过预编译方式和执行期动态代理实现程序功能的统一维护的一种技术. AOP也是Action Oriented Programming 的缩写,意为:面向切面编程,是函数式编程的一种衍生范型.AOP在其它领域也有其它含义. AOP的具体解释: 还是老规矩,站在巨人的肩膀上,看看其它人对AOP的理

Spring中的AOP注解方式和配置方式

今天学习了下spring中的切面编程:结合之前看过的视频.整合一下思路: 基本类: 接口: public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } 接口的实现: import org.springframework.stereotype.Component; @Component("ar

Spring中的AOP(8)

Spring的传统AOP AOP:不是由Spring定义.AOP联盟的组织定义.Spring中的通知:(增强代码) 前置通知 org.springframework.aop.MethodBeforeAdvice* 在目标方法执行前实施增强 后置通知 org.springframework.aop.AfterReturningAdvice* 在目标方法执行后实施增强 环绕通知 org.aopalliance.intercept.MethodInterceptor* 在目标方法执行前后实施增强 异常