基于@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 ...
随机推荐
- JSP页面中验证码的调用方法
步骤: 1.首先是要生成验证码 2.对验证码类进行调用:主要 实现的是 将验证码图片 输出到response.getOutputStream()这个输出流中 调用时,可以在页面调用,也可以在serv ...
- sqlserver 取月初月末的时间
1.取月初的时间 --getdate() :2012/05/08 19:29:00 select convert(varchar,dateadd(day,-day(getdate())+1,ge ...
- c标签 if else c标签 总结
[b]STL标签用法 关键字:JSTL标签.<c:choose>.<c:forEach>.<c:forTokens>.<c:if>.<c:impo ...
- ns2 错误(_O17 cmd line 1) 解决
重新安装ns2,发现了如下错误: (_o17 cmd line 1) invoked from within "_o17 cmd addr" invoked from within ...
- Android RecycleView添加HeaderView宽度不能撑满屏幕问题
下午做项目的时候,碰到页面布局需要使用RecycleView加HeaderView,本以为很简单东西,却有一个小小的坑:HeaderView布局的宽度不能撑满屏幕! 先看下出现问题的图: 天了噜,我写 ...
- WinForm 实现主程序(exe)与其关联类库(*.dll)分开存放
WinForm 实现主程序(exe)与其关联类库(*.dll)分开存放 开发环境: Microsoft Windows 7 SP1 Microsoft.NET Framework 4.0 ( ...
- 阿里云发布Apsara SA系列混合云存储阵列
3月21日,2019北京阿里云峰会上,阿里云正式发布Apsara SA系列混合云存储阵列,融合IP SAN,FC SAN,NAS和OSS对象存储协议于一体,同时实现了本地数据中心架构和公共云存储的无缝 ...
- cmd 命令重启远程服务器
今天,连接服务器突然无法连接远程桌面,更无法重新启动机器,先进行了ping 操作: 机器运行正常... 后通过远程软件发现,可以用命令...这是一个新发现 …^ .^ 1.输入cmd 运行正常. ...
- Python学习之路5☞文件处理
一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...
- ACK容器服务发布virtual node addon,快速部署虚拟节点提升集群弹性能力
在上一篇博文中(https://yq.aliyun.com/articles/647119),我们展示了如何手动执行yaml文件给Kubernetes集群添加虚拟节点,然而,手动执行的方式用户体验并不 ...