@annotation()概述
@annotation表示标注了某个注解的所有方法。

下面通过一个实例说明@annotation()的用法。 AnnotationTestAspect定义了一个后置切面增强,该增强将应用到标注了NeedTest的目标方法中。

实例
代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

首先我们先自定义一个注解@NeedTest。

如何自定义注解请参考Java-Java5.0注解解读

package com.xgj.aop.spring.advisor.aspectJ.function;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
*
*
* @ClassName: NeedTest
*
* @Description: 自定义注解@NeedTest
*
* @author: Mr.Yang
*
* @date: 2017年8月26日 下午11:19:12
*/ // 声明注解的保留期限
@Retention(RetentionPolicy.RUNTIME)
// 声明可以使用该注解的目标类型
@Target(ElementType.METHOD)
@Documented
public @interface NeedTest {
// 声明注解成员
boolean value() default false;
}

下面我们定义接口 Waiter

package com.xgj.aop.spring.advisor.aspectJ.function;

public interface Waiter {
public void greetTo(String clientName); public void serverTo(String clientName);
}

接口实现类 两个NaiveWaiter 和 NaughtWaiter

package com.xgj.aop.spring.advisor.aspectJ.function;

public class NaiveWaiter implements Waiter {

    @NeedTest(true)
@Override
public void greetTo(String clientName) {
System.out.println("NaiveWaiter:greet to " + clientName);
} @Override
public void serverTo(String clientName) {
System.out.println("NaiveWaiter:server to " + clientName);
} public void smile(String clientName, int times) {
System.out.println("NaiveWaiter:smile to " + clientName + " " + times
+ " times");
}
}
package com.xgj.aop.spring.advisor.aspectJ.function;

public class NaughtWaiter implements Waiter {

    @Override
public void greetTo(String clientName) {
System.out.println("NaughtWaiter:greet to " + clientName);
} @NeedTest(true)
@Override
public void serverTo(String clientName) {
System.out.println("NaughtWaiter:server to " + clientName);
} public void joke(String clientName, int times) {
System.out.println("NaughtyWaiter:play " + times + " jokes to "
+ clientName);
}
}

我们可以看到 NaiveWaiter#greetTo()方法标注了@NeedTest, NaughtWaiter#serverTo()也标注了@NeedTest,我们的目标就是将后置增强织入到这两个标注了@NeedTest的方法中。

接下来编写切面的横切逻辑

package com.xgj.aop.spring.advisor.aspectJ.function.annotationFun;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect; /**
*
*
* @ClassName: AnnotationTestAspect
*
* @Description: 切面 、 后置增强 ,@annotation表示标注了某个注解的所有方法
*
* @author: Mr.Yang
*
* @date: 2017年8月26日 下午11:23:53
*/ @Aspect
public class AnnotationTestAspect { @AfterReturning("@annotation(com.xgj.aop.spring.advisor.aspectJ.function.NeedTest)")
public void needTest() {
System.out.println("needTest() executed,some logic is here");
} }

接下来通过Spring自动应用切面,配置文件如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

<!-- 使用基于Schema的aop命名空间进行配置 -->

<!-- 基于@AspectJ切面的驱动器 -->
<aop:aspectj-autoproxy/>

<!-- 目标Bean -->
<bean id="naiveWaiter" class="com.xgj.aop.spring.advisor.aspectJ.function.NaiveWaiter"/>

<bean id="naughtWaiter" class="com.xgj.aop.spring.advisor.aspectJ.function.NaughtWaiter"/>

<!-- 使用了@AspectJ注解的切面类 -->
<bean class="com.xgj.aop.spring.advisor.aspectJ.function.annotationFun.AnnotationTestAspect"/>

</beans>

最后编写测试代码:

package com.xgj.aop.spring.advisor.aspectJ.function.annotationFun;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.xgj.aop.spring.advisor.aspectJ.function.Waiter; public class AnnotationTestAspcetTest { @Test
public void test() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"com/xgj/aop/spring/advisor/aspectJ/function/annotationFun/conf-annotation.xml"); // 必须是接口类型,否则抛类型转换异常
Waiter waiter = (Waiter) ctx.getBean("naiveWaiter"); // 因为greetTo标注了@NeedTest,因此会被后置增强
waiter.greetTo("XiaoGongJiang");
waiter.serverTo("XiaoGongJiang"); Waiter naughtWaiter = (Waiter) ctx.getBean("naughtWaiter");
// serverTo标注了@NeedTest,因此会被后置增强
naughtWaiter.serverTo("XiaoGongJiang");
}
}

运行结果:

2017-08-27 01:24:22,551  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6ac604: startup date [Sun Aug 27 01:24:22 BOT 2017]; root of context hierarchy
2017-08-27 01:24:22,647  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJ/function/annotationFun/conf-annotation.xml]
NaiveWaiter:greet to XiaoGongJiang
needTest() executed,some logic is here
NaiveWaiter:server to XiaoGongJiang
NaughtWaiter:server to XiaoGongJiang
needTest() executed,some logic is here

从输出结果中可以看出,切面被正确的织入到了标注有@NeedTest注解的方法中。

Spring-AOP @AspectJ切点函数之@annotation()的更多相关文章

  1. Spring AOP + AspectJ annotation example

    In this tutorial, we show you how to integrate AspectJ annotation with Spring AOP framework. In simp ...

  2. Spring AOP + AspectJ Annotation Example---reference

    In this tutorial, we show you how to integrate AspectJ annotation with Spring AOP framework. In simp ...

  3. 关于 Spring AOP (AspectJ) 该知晓的一切

    关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 本篇是年后第一篇博文,由于博主用了不少时间在构思这篇博文,加上 ...

  4. 关于 Spring AOP (AspectJ) 你该知晓的一切

    版权声明:本文为CSDN博主「zejian_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/javazej ...

  5. Spring学习(十八)----- Spring AOP+AspectJ注解实例

    我们将向你展示如何将AspectJ注解集成到Spring AOP框架.在这个Spring AOP+ AspectJ 示例中,让您轻松实现拦截方法. 常见AspectJ的注解: @Before – 方法 ...

  6. 关于 Spring AOP (AspectJ) 你该知晓的一切 (转)

    出处:关于 Spring AOP (AspectJ) 你该知晓的一切

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

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

  8. Spring AOP @AspectJ 入门基础

    需要的类包: 1.一个简单的例子 Waiter接口: package com.yyq.annotation; public interface Waiter { void greetTo(String ...

  9. spring AOP AspectJ 定义切面实现拦截

    总结记录一下AOP常用的应用场景及使用方式,如有错误,请留言. 1.  讲AOP之前,先来总结web项目的几种拦截方式    A:  过滤器 使用过滤器可以过滤URL请求,以及请求和响应的信息,但是过 ...

随机推荐

  1. mysql 登录报错

    执行命令:mysql -u root -p 错误:error while loading shared libraries: libncurses.so.5: cannot open shared o ...

  2. 最新my.cnf可用于5.6&5.7

    [MySQL]prompt = [\\u@\\h][\\d]>\\_  #自定义登录提示信息 [mysqld]#基本设置#user = mysql #用户名sql_mode =“STRICT_T ...

  3. java 静态代码块和spring @value等注解注入顺序

      java 静态代码块和spring @value等注解注入顺序 问题所在 先上代码 java方法 @Value("${mf.cashost}") public static S ...

  4. 代码重复检查工具——python的使用CPD比较好用,clone digger针对py2,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro

    代码重复检测: cpd --minimum-tokens 100 --files g:\source\python\ --language python >log.txt 输出类似: ===== ...

  5. EF映射——从数据库更新实体

    最近在做ITOO项目,由于更新了数据库,需要重新从数据库映射到实体,本来看过关于EF的学习资料,直接可以从数据库更新到实体,但这种小事也是有很多问题的,必须在更新的时候做好选择.下面分享一下如何从数据 ...

  6. 2019-2020-1 20199301《Linux内核原理与分析》第七周作业

    第六章 进程的描述和进程的创建 学习笔记 1.操作系统的三大管理功能: 进程管理 内存管理 文件系统 2.操作系统最核心的功能是进程管理. 3.为了管理进程,内核要描述进程的结构,也成为进程描述符,进 ...

  7. Flume源码更改

    1.源码更改场景:如果使用 0.8 版本 Kafka 并配套 1.6 版本 Flume,由于 Flume 1.6 版本没有Taildir Source 组件,因此,需要将 Flume 1.7 中的 T ...

  8. Python中对列表排序实例

    Python中对列表排序实例 发布时间:2015-01-04 09:01:50 投稿:junjie 这篇文章主要介绍了Python中对列表排序实例,本文给出了9个List的排序实例,需要的朋友可以参考 ...

  9. postgresql Kill掉正在执行的SQL语句

    kill方式是杀掉进程,但是有时候需要取消相关SQL语句,采用以下方式 一.查看哪些SQL语句正在执行 语句如下:SELECT datname,procpid,query_start, current ...

  10. Linux https认证原理

    HTTPS在传输的过程中会涉及到三个密钥:服务器端的公钥和私钥,用来进行非对称加密客户端生成的随机密钥,用来进行对称加密一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步.1.客户端向服务 ...