好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring-AOP @AspectJ切点函数之@annotation()用法

@annotation()概述

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

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

实例

代码已托管到Github—> https://github测试数据/yangshangwei/SpringMaster

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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

?

1

2

3

4

5

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

public interface Waiter {

  public void greetTo(String clientName);

  public void serverTo(String clientName);

}

接口实现类 两个NaiveWaiter 和 NaughtWaiter

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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" );

     }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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的方法中。

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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自动应用切面,配置文件如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<? xml version = "1.0" encoding = "UTF-8" ?>

< beans xmlns = "http://HdhCmsTestspringframework.org/schema/beans"

     xmlns:aop = "http://HdhCmsTestspringframework.org/schema/aop"

     xmlns:xsi = "http://HdhCmsTestw3.org/2001/XMLSchema-instance"

     xsi:schemaLocation="http://HdhCmsTestspringframework.org/schema/beans

         http://HdhCmsTestspringframework.org/schema/beans/spring-beans.xsd

         http://HdhCmsTestspringframework.org/schema/aop

         http://HdhCmsTestspringframework.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 >

最后编写测试代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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注解的方法中。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://artisan.blog.csdn.net/article/details/77619875

查看更多关于Spring-AOP @AspectJ切点函数之@annotation()用法的详细内容...

  阅读:12次