要启用基于@AspectJ风格的切面声明,需要进行以下的配置:

<!-- 启用@AspectJ风格的切面声明 -->
<aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 通过注解定义bean。默认同时也通过注解自动注入 -->
<context:component-scan base-package="com.cjm"/>

基于@AspectJ风格的切面声明的源码:

/**
* 声明本类为一个切面
*/
@Component
@Aspect
public class MyAspectJ {
/**
* 声明一个切入点(包括切入点表达式和切入点签名)
*/
@Pointcut("execution(* com.cjm.model..*.*(..))")
public void pointcut1(){} /**
* 声明一个前置通知
*/
@Before("pointcut1()")
public void beforeAdvide(JoinPoint point){
System.out.println("触发了前置通知!");
} /**
* 声明一个后置通知
*/
@After("pointcut1()")
public void afterAdvie(JoinPoint point){
System.out.println("触发了后置通知,抛出异常也会被触发!");
} /**
* 声明一个返回后通知
*/
@AfterReturning(pointcut="pointcut1()", returning="ret")
public void afterReturningAdvice(JoinPoint point, Object ret){
System.out.println("触发了返回后通知,抛出异常时不被触发,返回值为:" + ret);
} /**
* 声明一个异常通知
*/
@AfterThrowing(pointcut="pointcut1()", throwing="throwing")
public void afterThrowsAdvice(JoinPoint point, RuntimeException throwing){
System.out.println("触发了异常通知,抛出了RuntimeException异常!");
} /**
* 声明一个环绕通知
*/
@Around("pointcut1()")
public Object aroundAdvice(ProceedingJoinPoint point)throws Throwable{
System.out.println("触发了环绕通知 开始");
Object o = point.proceed();
System.out.println("触发了环绕通知 结束");
return o;
}
}

1、切入点表达式的格式:execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])

2、切入点表达式通配符:       *:匹配所有字符       ..:一般用于匹配多个包,多个参数       +:表示类及其子类

3、切入点表达式支持逻辑运算符:&&、||、!

4、切入点表达式关键词:

1)execution:用于匹配子表达式。

//匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意             @Pointcut("execution(* com.cjm.model..*.*(..))")             public void before(){}

2)within:用于匹配连接点所在的Java类或者包。

//匹配Person类中的所有方法

@Pointcut("within(com.cjm.model.Person)")

public void before(){}

//匹配com.cjm包及其子包中所有类中的所有方法

@Pointcut("within(com.cjm..*)")

public void before(){}

3) this:用于向通知方法中传入代理对象的引用。

@Before("before() && this(proxy)")

public void beforeAdvide(JoinPoint point, Object proxy){

//处理逻辑

}

4)target:用于向通知方法中传入目标对象的引用。

@Before("before() && target(target)

public void beforeAdvide(JoinPoint point, Object proxy){

//处理逻辑

}

5)args:用于将参数传入到通知方法中。

@Before("before() && args(age,username)")

public void beforeAdvide(JoinPoint point, int age, String username){

//处理逻辑

}

6)@within:用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。

@Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配

public void before(){}

  @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Inherited
public @interface AdviceAnnotation { }

7)@target:和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。

@Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")

public void before(){}

8)@args:传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。

@Before("@args(com.cjm.annotation.AdviceAnnotation)")

public void beforeAdvide(JoinPoint point){

//处理逻辑

}

public class Person {
public void say(Address address){
//处理逻辑
}
} @AdviceAnnotation
public class Address { }

如果需要在Person类的say方法被调用时触发beforeAdvide通知,那么say方法的参数对应的Java类型Address类必须要被@AdviceAnnotation标注。

9)@annotation:匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。

@Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")

public void before(){}

public class Person {
@AdviceAnnotation
public void say(Address address){
//处理逻辑
}
}

Person类的say方法被@AdviceAnnotation标注,所以它匹配。

10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。

@Pointcut("bean(person)")

public void before(){}

id为person的受管Bean中的所有方法都将匹配。

Spring AOP使用整理:使用@AspectJ风格的切面声明的更多相关文章

  1. spring AOP 之二:@AspectJ注解的3种配置

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

  2. spring AOP 之三:使用@AspectJ定义切入点

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

  3. Spring AOP 知识整理

    通过一个多月的 Spring AOP 的学习,掌握了 Spring AOP 的基本概念.AOP 是面向切面的编程(Aspect-Oriented Programming),是基于 OOP(面向对象的编 ...

  4. Spring AOP基于配置文件的面向方法的切面

    Spring AOP基于配置文件的面向方法的切面 Spring AOP根据执行的时间点可以分为around.before和after几种方式. around为方法前后均执行 before为方法前执行 ...

  5. spring aop在mvc的controller中加入切面无效

    spring aop在mvc的controller中加入切面无效 因为MVC的controller,aop默认使用jdk代理.要使用cglib代理. 在spring-mybatis.xml配置文件中加 ...

  6. Spring AOP使用整理:各种通知类型的介绍

    2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; p ...

  7. Spring AOP使用整理:自动代理以及AOP命令空间

    三.自动代理的实现 1.使用BeanNameAutoProxyCreator 通过Bean的name属性自动生成代理Bean. <bean class="org.springframe ...

  8. Spring AOP—注解配置方法的使用

    Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明. 1 启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需 ...

  9. Spring AOP支持的AspectJ切入点语法大全

    原文出处:http://jinnianshilongnian.iteye.com/blog/1420691 Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的, ...

随机推荐

  1. windows网络编程的一些理论

    参考自<VC++深入详解> 这是我在看书时记录下来的东西. 注:下面的Socket其实都应该是socket 第14章网络编程 Socket是连接应用程序与网络驱动程序的桥梁,Socket在 ...

  2. Bootstrap系列 -- 33. 等分按钮

    等分按钮也常被称为是自适应分组按钮,其实现方法也非常的简单,只需要在按钮组“btn-group”上追加一个“btn-group-justified”类名. <div class="bt ...

  3. JS BOM知识整理

    BOM部分主要是针对浏览器的内容,其中常用的就是window对象和location, window是全局对象很多关于浏览器的脚本设置都是通过它. location则是与地址栏内容相关,比如想要跳转到某 ...

  4. JavaWeb项目前端规范(采用命名空间使js深度解耦合)

    没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的 ...

  5. druid(德鲁伊)数据源的使用和配置 阿里出品

    pom.xml <dependency>     <groupId>com.alibaba</groupId>     <artifactId>drui ...

  6. 【UVA 11401】Triangle Counting

    题 题意 求1到n长度的n根棍子(3≤n≤1000000)能组成多少不同三角形. 分析 我看大家的递推公式都是 a[i]=a[i-1]+ ((i-1)*(i-2)/2-(i-1)/2)/2; 以i 为 ...

  7. Day1 login

    使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...

  8. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

  9. groovy-语句

    groovy语句类似于java语句,但是在groovy中的分号”;”是可选的.比如: 1 def x = [1, 2, 3] 2 println x 3 def y = 5; def x = y +  ...

  10. UvaLive 5026 Building Roads

    传送门 Time Limit: 3000MS Description There is a magic planet in the space. There is a magical country ...