基于@AspectJ注解配置切面与基于XML配置切面
1. Waiter目标类
package com.smart.aop.advice.pointcut;
public class Waiter {
public void greetTo(String name) {
System.out.println("Waiter greet to " + name + " ...");
}
public void serverTo(String name) {
System.out.println("waiter server to " + name + " ...");
}
}
2. 使用AspectJ注解定义切面
package com.smart.aop.advice.aspectj; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; @Aspect
public class PreGreetingAspect { @Before ("execution(* greetTo(..))") //定义连接点(连接点方位信息--前置增强, 切点--所有目标类的greetTo方法--可带任意的入参和返回值)
public void beforeGreeting() {
System.out.println("How are you!"); //方法体为增强逻辑
}
}
3. 通过编程的方式织入切面,为Waiter生成织入了xxx切面的代理
package com.smart.aop.advice.aspectj; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;
import org.testng.annotations.Test;
import com.smart.aop.advice.pointcut.Waiter; public class AspectJProxyTest { @Test
public void beforeTest() { Waiter waiter = new Waiter();
AspectJProxyFactory pFactory = new AspectJProxyFactory(); pFactory.setTarget(waiter); //设置目标实例
pFactory.addAspect(PreGreetingAspect.class); //添加切面类 Waiter proxyWaiter = pFactory.getProxy(); //生成织入代理的代理对象 /**
* 由切面类中的切点信息execution(* greetTo(..))
* 可知代理对象proxyWaiter的greetTo方法织入了切面类所定义的增强逻辑
*/
proxyWaiter.greetTo("Jack");
proxyWaiter.serverTo("Jack");
}
}
输出结果:
How are you!
Waiter greet to Jack ...
waiter server to Jack ...
4. 通过Spring配置方式织入切面
1)xml 配置
<!-- 匹配切点的目标bean -->
<bean id="waiter" class="com.smart.aop.advice.pointcut.Waiter" /> <!-- 使用@AspectJ标注的切面类 -->
<bean class="com.smart.aop.advice.aspectj.PreGreetingAspect" /> <!-- 自动代理创建器,能够将@AspectJ标注的切面自动织入到目标bean中 -->
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
2)测试
package com.smart.aop.advice.aspectj; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test; import com.smart.aop.advice.pointcut.Waiter; public class SpringAspectJTest { @Test
public void beforeTest() { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/smart/aop/advice/aspectj/beans-aspectj.xml");
Waiter waiter = ctx.getBean("waiter", Waiter.class); waiter.greetTo("Jack");
waiter.serverTo("Jack");
}
}
------------------------------------------------------------------------
基于XML配置切面
把切面类中的通过@Aspect和@Before("execution(* greetTo(..))")配置的‘连接点(切点和增强类型)’信息从切面类中剥离出来放到XML中配置,使原来的切面类成为真正意义上的POJO
1. 切面类 --- 成为一个普通的java类
package com.smart.aop.advice.aspectj;
public class PreGreetingAspect {
public void preGreeting() {
System.out.println("切入代码 How are you!");
}
}
2. 在XML中配置切面
<!-- 目标bean实例 -->
<bean id="waiter" class="com.smart.aop.advice.pointcut.Waiter" />
<!-- 切面实例 -->
<bean id="greetingAspect" class="com.smart.aop.advice.aspectj.PreGreetingAspect" /> <!-- proxy-target-class
true, 声明的切面使用cglib代理技术
false, 声明的切面使用JDK代理技术
-->
<aop:config proxy-target-class="true">
<aop:aspect ref="greetingAspect">
<!--
aop:before,为前置增强
method属性,指定增强方法
pointcut属性,定义切点表达式
-->
<aop:before method="preGreeting" pointcut="target(com.smart.aop.advice.pointcut.Waiter) and execution(* greetTo(..))"/>
</aop:aspect>
</aop:config>
使用4-2的方法测试,验证System.out.println("切入代码 How are you!");已织入到Waiter#greeTo()方法的前面。
加入后置增强
1. 切面类
package com.smart.aop.advice.aspectj;
public class PreGreetingAspect {
public void preGreeting() {
System.out.println("Waiter#greetTo()方法执行前织入 How are you!");
}
public void postGreeting() {
System.out.println("Waiter#greetTo()方法执行后织入 Byte!");
}
}
2. XML配置
<!-- 目标bean实例 -->
<bean id="waiter" class="com.smart.aop.advice.pointcut.Waiter" />
<!-- 切面实例 -->
<bean id="greetingAspect" class="com.smart.aop.advice.aspectj.PreGreetingAspect" /> <!-- proxy-target-class
true, 声明的切面使用cglib代理技术
false, 声明的切面使用JDK代理技术
-->
<aop:config proxy-target-class="true"> <aop:pointcut id="greetToPointcut"
expression="target(com.smart.aop.advice.pointcut.Waiter) and execution(* greetTo(..))" /> <!-- 定义一个切面greetingAspect -->
<aop:aspect ref="greetingAspect">
<!--
aop:before,为前置增强
method属性,指定增强方法
pointcut属性,定义切点表达式
-->
<aop:before method="preGreeting" pointcut-ref="greetToPointcut"/>
</aop:aspect> <aop:aspect ref="greetingAspect">
<aop:after method="postGreeting" pointcut-ref="greetToPointcut"/>
</aop:aspect>
</aop:config>
3. 测试
@Test
public void beforeTest() { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/smart/aop/advice/aspectj/beans-aspectj.xml");
Waiter waiter = ctx.getBean("waiter", Waiter.class); waiter.greetTo("Jack");
waiter.serverTo("Jack");
} 输出结果:
Waiter#greetTo()方法执行前织入 How are you!
Waiter greet to Jack ...
Waiter#greetTo()方法执行后织入 Byte!
waiter server to Jack ...
基于@AspectJ注解配置切面与基于XML配置切面的更多相关文章
- Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- spring-AOP框架(基于AspectJ注解配置AOP)
基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...
- spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)
1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...
- Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现
转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...
- Spring Aop(四)——基于Aspectj注解的Advice介绍
转发地址:https://www.iteye.com/blog/elim-2395315 4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.af ...
- eclipse环境Dynamic web module version 3.1版本的进步,简化Dynamic web object 中Servlet类的配置,不用web.xml配置<Servlet>
eclipse环境Dynamic web module version 3.1版本之前,Dynamic web object 中Servlet类的配置,要在web.xml 配置<Servlet& ...
- 基于Aspectj 注解实现 spring AOP
AOP 面向切面编程,是 OOP (面向对象编程)的补充 术语 横切关注点:方法中非主要业务逻辑部分 比如运算的模块:有验证参数.执行方法前的操作.执行方法.执行方法后的操作,验证参数.执行方法前后的 ...
- 基于AOP注解实现业务功能的动态配置
一.导入jar包 <dependency><!-- 4.引入AOP--> <groupId>org.springframework.boot</groupId ...
随机推荐
- 学习JDK1.8集合源码之--HashSet
1. HashSet简介 HashSet是一个不可重复的无序集合,底层由HashMap实现存储,故HashSet是非线程安全的,由于HashSet使用HashMap的Key来存储元素,而HashMap ...
- Lunix文件的读写权限问题
今天把在windows平台build好的lunix执行文件复制到Lunix的虚拟机上,发现可执行文件不能执行了,后来才发现文件时有读写和可执行权限的,但是是可以更改的,右键属性,把可执行属性勾选上就可 ...
- iOS GCD 使用
1. dispatch queue的概念 dispatch queue分成以下三种: a)运行在主线程的Main queue,通过dispatch_get_main_queue获取.dispatch_ ...
- firefox扩展开发(一) : 扩展的基本结构
用过firefox的人肯定要安装firefox的扩展,这样才能发挥火狐的全部实力.一般扩展是一个后缀为.xpi的文件,其实这个文件就是zip格式的压缩包,压缩了一个扩展所需要的所有目录和文件,基本的目 ...
- KiCad 5.1.0 镜像圆弧后错位问题
KiCad 5.1.0 镜像圆弧后错位问题 看官方回复这个问题将在 5.1.3 进行修复,因为这段时间在举行 KiCon 活动. 看到这个问题并不是非常严重,不是致命的,所以已经从 5.1.0 跳到 ...
- [Java]ssh网上商城总结 标签: hibernatessh 2016-05-15 21:03 1099人阅读 评论(32)
前几日敲完了ssh网上商城,虽然现在已经敲完了整个系统,却发现自己对于ssh,了解的一点都不多,什么是struts2,什么是spring,什么是hibernate,自己都是稀里糊涂,然后看了一下后面的 ...
- vue cli3 子目录问题
在使用 vue-cli3 build的时候,使用非子目录需要在 vue.config.js 中添加如下代码: module.exports = { baseUrl: process.env.NODE_ ...
- @codeforces - 444A@ DZY Loves Physics
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 点 m 边的图,边有边权,点有点权. 找到一个连通 ...
- 设置PHP最长运行时间
通常来说,默认的PHP程序最大运行时间是30s,如果你的程序运行超过这个时间限制,那么会有类似Maximum execution time of 30 seconds exceeded的报错. 有几种 ...
- Uva 10334
UVa 10334 这道题几乎和UVa 495是一样的. #include<iostream> #include<cstdio> #define mod 1000000 usi ...