在前面我们使用Pointcut和Advice描述切点和增强, 并使用Advisor整合两者描述切面.@AspectJ使用注解来描述切点和增强.两者使用的方式不同, 但是在本质上都是一样的.

  我们还是用以前的例子来举例, 学习如何使用@AspectJ来描述切点和增强.首先看一个简单的例子.

package com.bao.bao.aspectj;

/**
 * Created by xinfengyao on 16-10-23.
 */
public interface Waiter {
    public void greetTo(String clientName);
    public void serveTo(String clientName);
}
package com.bao.bao.aspectj;

/**
 * Created by xinfengyao on 16-10-23.
 */
public class NaiveWaiter implements Waiter {

    @Override
    public void greetTo(String clientName) {
        System.out.println("NaiveWaiter greetTo " + clientName + "...");
    }

    @Override
    public void serveTo(String clientName) {
        System.out.println("NaiveWaiter serveTo " + clientName + "...");
    }
}

  下面我们使用AspectJ定义一个切面

package com.bao.bao.aspectj;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * Created by xinfengyao on 16-10-23.
 */
@Aspect
public class PreGreetingAspect {
    @Before("execution(* greetTo(..))")
    public void beforeGreeting() {
        System.out.println("Here are you!");
    }

}

  我们发现, 这个类没用实现任何特殊的接口, 只是一个普通的POJO, 特殊之处是使用了@AspectJ注解.

  首先在PreGreetingAspect上面标注了@Aspect的注解, 第三方程序就可以使用这个注解来判断某个类是否是一个切面;其次, 我们在beforeGreeting()方法上面标注了注解@Before, 并提供了参数execution(*greetTo(..), 这个注解提供了两个信息, @Before注解表示该增强是一个前置增强,而成员值是一个AspectJ表达式, 含义是:在目标类的greetTo()方法上织入增强, greetTo()方法可以带任意的入参和返回任意值;最后在beforeGreeting()方法中定义的就是增强逻辑, 该横切逻辑在目标方法前调用.

  PreGreetingAspect通过注解, 将切点, 增强的类型和增强的逻辑糅合在一起, 是切面的定义浑然天成.PreGreetingAspect就相当于我们之前定义的BeforeAdvice, NameMatchMethodPointcut以及DefaultPointcutAdvisor联合表达的信息.

  下面我们通过org.springframework.aop.aspectj.annotation.AspectJProxyFactory为NaiveWaiter生成织入PreGreetingAspect切面的代理.

package com.bao.bao.aspectj;

import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;

/**
 * Created by xinfengyao on 16-10-23.
 */
public class AspectJProxyTest {
    public static void main(String[] args) {
        AspectJProxyFactory proxyFactory = new AspectJProxyFactory();
        Waiter target = new NaiveWaiter();
        proxyFactory.setTarget(target);
        proxyFactory.addAspect(PreGreetingAspect.class);

        Waiter proxy = proxyFactory.getProxy();
        proxy.greetTo("tom");
        proxy.serveTo("marry");
    }
}

  运行结果:

Here are you!
NaiveWaiter greetTo tom...
NaiveWaiter serveTo marry...

  通过输出信息我们可以看到, 代理对象的greetTo()方法已经织入了切面类所定义的横切逻辑.

  虽然可以通过编程的方式织入切面, 但一般都是通过spring配置文件的方式完成织入切面的工作.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="waiter" class="com.bao.bao.aspectj.NaiveWaiter"/>
    <bean class="com.bao.bao.aspectj.PreGreetingAspect"/>

    <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>
</beans>

  在前面我们介绍过两种自动代理创建器, AnnotationAwareAspectJAutoProxyCreator能够将@AspectJ注解的切面自动织入到目标bean中.

  如果使用基于schema的aop命名空间进行配置就更简单了.

    <bean id="waiter" class="com.bao.bao.aspectj.NaiveWaiter"/>
    <bean class="com.bao.bao.aspectj.PreGreetingAspect"/>

    <aop:aspectj-autoproxy/>

  通过aop命名空间的<aop:aspectj-autoproxy/>自动为spring容器中的那些匹配@AspectJ切面的bean自动创建代理, 完成切面织入.其实spring在内部的原理还是使用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作.

基于@AspectJ和schema的aop(一)的更多相关文章

  1. (spring-第19回【AOP基础篇】)基于AspectJ和Schema的AOP

    基于AspectJ就是基于@AspectJ注解,基于Schema就是全部依靠配置文件.那么首先要了解Java注解. Java注解初探 在JDK5.0中,我们可以自定义标签,并通过Java语言的反射机制 ...

  2. 基于@AspectJ和schema的aop(二)---@AspectJ基础语法

    @AspectJ使用jdk5.0和正规的AspectJ切点表达式描述切面, 由于spring只支持方法的连接点,所以Spring只支持部分AspectJ的切点语言. 1.切点表达式函数 AspectJ ...

  3. 基于@AspectJ和schema的aop(四)---@AspectJ进阶

    @AspectJ可以使用切点函数定义切点, 我们还可以使用逻辑运算对切点进行复合运算得到复合的切点. 我们还可以对切点进行命名, 从而可以复用切点.当一个连接点匹配多个切点时, 需要考虑增强织入的顺序 ...

  4. 基于@AspectJ和schema的aop(三)---切点函数详解

    切点函数是AspectJ表达式语言的核心, 也是使用@AspectJ进行切面定义的难点.本小节我们通过具体的实例对切点函数进行深入学习. 1.@annotation() @annotation()表示 ...

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

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

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

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

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

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

  8. Spring框架 aop操作的注解方法 基于aspectj的自动注解aop方法 抽取相同的value="execution(public void cn.itcast.f_aspect.CRUD.*())"

    首先是在xml配置文件中配置好对象,然后开启aop的注解方法——即<aop:aspectj-autoproxy></aop:aspectj-autoproxy> xml代码如下 ...

  9. 基于Aspectj 注解实现 spring AOP

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

随机推荐

  1. dij最短路优先队列堆的时候,加边

    不能用全局数组d[u]>d[rhs.u]. 这样后面会修改d[u]值然而本来里面的点顺序不该修改,却被修改了. 应该用栈还存进去的临时变量,比如d>rhs.d. 优先队列重载小于号'< ...

  2. extjs实现简单的多文件上传(不借助任何插件),以及包含处理上传大文件的错误的各种处理办法

    在extjs的学习过程中,有遇到过有关多文件上传的问题,但是网上的大多数都是专门的去实现多文件上传而去做的组件之类的,没有特别简单的方式,于是小白便做了下面的内容,只是通过动态的去添加extjs的自带 ...

  3. JSP和servlet有什么区别?

    JSP和servlet有什么区别? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达. JSP编译后是"类servlet". Servlet ...

  4. Linux内核之旅 链表实现

    #include "stdio.h" #include "stdlib.h" struct list_head{ struct list_head *prev; ...

  5. Android -- 自定义View小Demo(一)

    1,现在要实现下图的简单效果,很简单  ,就是使用paint在canvas上绘制5中不同颜色的圆圈,效果图如下: 这是绘制基本图形一种最简单的方法,下面是它的代码 ,注释写的很详细,也就不去讲解了 M ...

  6. php操作oracle的方法类集全

    在网上开始找php中操作oracle的方法类~ 果然找到一个用php+oracle制作email表以及插入查询的教程,赶忙点开来看,从头到尾仔细的看了一遍,还没开始操作,便觉得收获很大了.地址在此:h ...

  7. . ToString(),Convert.ToString(),(string),as比较:

    http://www.cnblogs.com/chehaoj/archive/2010/02/23/1671955.html 通常 object 到 string 有四种方式(假设有object ob ...

  8. 解析xml文件

    package com.ss1.xml; import java.io.File; import java.io.FileOutputStream; import java.io.IOExceptio ...

  9. 「Ruby && Sqlite3」How to install sqlite3 for ruby? (solve: sqlite-ruby no such file...)

    error message:           no such file .... 安装 gem install sqlite3-ruby -- --with-sqlite3-dir=/usr/lo ...

  10. js编写规范

    JavaScript编码规范 Bug----33条 1. 不要使用’==’和’!=’,使用’===’和’!==’替代 等级:Major 原因:==和!=在判断值相等前会判断类型是否相等.这容易因为类型 ...