基于@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 ...
随机推荐
- 洛谷 P1420 最长连号【最长合法子序列/断则归一】
题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入输出格式 输入格式: 第一行,一个数n; 第二行,n个正整数,之间用空格隔 ...
- php去除文件bom头
有时候在ajax返回的json数据前多出一些不明的字符,就是所谓的bom头,导致javascript解析json格式失败,下面贴出一段PHP代码实现检测和去除bom头. <?php header ...
- 介绍Provide以及Inject
介绍 Vue 的 Provide 以及 Inject Provide 以及 Inject 是 Vue 中用于祖先元素向其所有后台元素注入依赖的接口. 具体用法 // Data.vue ... expo ...
- 【水滴石穿】React-Redux-Demo
这个项目没有使用什么组件,可以理解就是个redux项目 项目地址为:https://github.com/HuPingKang/React-Redux-Demo 先看效果图 点击颜色字体颜色改变,以及 ...
- R语言-组间差异的非参数检验
R语言-组间差异的非参数检验 7.5 组间差异的非参数检验 如果数据无法满足t检验或ANOVA的参数假设,可以转而使用非参数方法.举例来说,若结果变量在本质上就严重偏倚或呈现有序关系,那么你可能会希望 ...
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.trs.om.bean.User.retryCount
六月 29, 2019 5:42:45 下午 org.apache.catalina.core.AprLifecycleListener init信息: The APR based Apache To ...
- php Laravel Thrift使用TMultiplexedProcessor复用端口模式
thrift的使用中一般是一个Server对应一个Processor和一个Transport,如果有多个服务的话,那必须要启动多个Server,占用多个端口,这种方式显然不是我们想要的,所以thrif ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- sql —— in
IN 操作符允许我们在 WHERE 子句中规定多个值. 原表: 执行查询:
- Zabbix清理历史数据库,缩减表大小
zabbix 由于历史数据过大, 因此导致磁盘空间暴涨, 下面是解决方法步骤: 一.分析数据库: 1. 统计数据库中每个表所占的空间: mysql> SELECT table_name AS ...