基于@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 ...
随机推荐
- 洛谷P1929 迷之阶梯
P1929 迷之阶梯 题目描述 在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解.它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器.防卫小队立即赶 到这处遗迹. ...
- 使用split_size优化的ODPS SQL的场景
使用split_size优化的ODPS SQL的场景 首先有两个大背景需要说明如下:说明1:split_size,设定一个map的最大数据输入量,单位M,默认256M.用户可以通过控制这个变量,从而达 ...
- 大数据技术之Hadoop入门
第1章 大数据概论 1.1 大数据概念 大数据概念如图2-1 所示. 图2-1 大数据概念 1.2 大数据特点(4V) 大数据特点如图2-2,2-3,2-4,2-5所示 图2-2 大数据特点之大量 ...
- Apache Camel继承Spring Boot 实现文件远程复制和转移
pom.xml <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-f ...
- retailMall-vuedemo1
//home.vue <template> <div class="home"> <div class="top-info"> ...
- Effective C++: 08定制new和delete
49:了解new-handler的行为 当operator new无法满足某一内存分配需求时,它会抛出异常(以前会返回一个null).在抛出异常之前,它会调用一个客户指定的错误处理函数,也就是所谓的n ...
- centos6.5后台进程的切换
1.运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令. (1)&命令 功能:加在一个命令的最后,可以把这 ...
- WPF HTTP请求(GET,POST)
WPF HTTP请求(GET,POST) using System; using System.Collections.Generic; using System.IO; using System.L ...
- 小爬爬7:回顾&&crawlSpider
1.回顾昨日内容 回顾 - 全站数据爬取(分页) - 手动请求的发送Request(url,callback) - post请求和cookie处理 - start_requests(self) - F ...
- 用预编译包安装zabbix-agent
如果主机无法上网,安装rpm又缺少依赖时,可以通过预编译包进行安装zabbix-agent,下载地址 https://www.zabbix.com/download 下载后,执行如下命令: wget ...