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配置切面的更多相关文章

  1. Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...

  2. Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

    由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...

  3. spring-AOP框架(基于AspectJ注解配置AOP)

    基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...

  4. spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

    1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...

  5. Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现

    转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...

  6. Spring Aop(四)——基于Aspectj注解的Advice介绍

    转发地址:https://www.iteye.com/blog/elim-2395315 4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.af ...

  7. 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& ...

  8. 基于Aspectj 注解实现 spring AOP

    AOP 面向切面编程,是 OOP (面向对象编程)的补充 术语 横切关注点:方法中非主要业务逻辑部分 比如运算的模块:有验证参数.执行方法前的操作.执行方法.执行方法后的操作,验证参数.执行方法前后的 ...

  9. 基于AOP注解实现业务功能的动态配置

    一.导入jar包 <dependency><!-- 4.引入AOP--> <groupId>org.springframework.boot</groupId ...

随机推荐

  1. Codeforces Round #416 (Div. 2) A. Vladik and Courtesy【思维/模拟】

    A. Vladik and Courtesy time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. 【JZOJ4930】【NOIP2017提高组模拟12.18】C

    题目描述 给出一个H的行和W列的网格.第i行第j列的状态是由一个字母的A[i][j]表示,如下: "." 此格为空. "o" 此格包含一个机器人. " ...

  3. js的下拉刷新和上拉加载,基于iScroll v4.2.5

    html部分 <div id="wrapper" style="height: 100%"> <div id="scroller&q ...

  4. PHPCMS快速建站系列之pc:get标签的应用

    GET标签使用方式如下: {pc:get sql="SELECT * FROM phpcms_member" cache="3600" page="$ ...

  5. 阿里小二的日常工作要被TA们“接管”了!

    昨天有人偷偷告诉我说 阿里巴巴其实是一家科技公司! 我想了整整一夜 究竟是谁走漏了风声 那么重点来了,阿里到底是如何在内部的办公.生活中,玩转“黑科技”的呢? AI取名:给你专属的“武侠”花名 花名是 ...

  6. css面试题总结(转)

    转自此网页http://www.cnblogs.com/YangqinCao/p/5721810.html. 1.两栏布局,左边栏宽度固定,适应父元素高度变化 首先分析两栏布局, 两栏布局两种常见方法 ...

  7. poj 2236【并查集】

    poj 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical t ...

  8. Hbuilder的使用技巧

    /*注:本教程针对HBuilder5.0.0,制作日期2014-12-31*/创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter)中途换行 ...

  9. Person Re-identification 系列论文笔记(五):SVD-net

    SVDNet for Pedestrian Retrieval Sun Y, Zheng L, Deng W, et al. SVDNet for Pedestrian Retrieval[J]. 2 ...

  10. 字体图标font-awesome

    其实有一些常见的图标使用字体图标比使用img来得好 Font Awesome 官网:http://fortawesome.github.io/Font-Awesome/ 字体代码:http://for ...