AOP知识
切入点表达式
1.bean表达式
说明:根据bean的ID拦截指定的对象
@Pointcut("bean(userServiceImpl)")
public void pointcut(){
}
2.within表达式
说明: 按照类型匹配. 可以使用通配符*号
1. @Pointcut("within(com.jt.service.UserServiceImpl)")
只拦截UserServiceImpl的类
2. @Pointcut("within(com.jt.service.*)")
拦截com.jt.service下的一级的类.
3. @Pointcut("within(com.jt.service..*)")
拦截com.jt.service下所有包下的所有类
4. @Pointcut("within(com.*.service..*)")
拦截com.任意包.service下所有包下的所有类
说明:上述的2种操作方法 粒度较粗,一般情况下不用
3.execution表达式
作用: 粒度比较细,可以按照方法参数进行匹配
语法: @Pointcut("execution(返回值类型 包名.类名.方法名(参数列表))")
1. 按照类型方法匹配
@Pointcut("execution(* com.jt.service.UserServiceImpl.addUser())")
2. 要求返回值任意, com.jt.service包下的所有的子孙类中的任意方法的任意参数要求拦截.
@Pointcut("execution(* com.jt.service..*.*(..))")
3. 要求返回值任意, com.jt.service包下的所有的子孙类中的add开头的方法并且参数1个是int类型 进行拦截
@Pointcut("execution(* com.jt.service..*.add*(int))")
4.@annotation表达式
作用: 可以根据用户的自定义注解进行拦截
4.1 完成自定义注解Wyd
package com.jt.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) //注解运行期有效
@Target(ElementType.METHOD) //注解标识方法
public @interface Wyd {
}
4.2 标记注解
@Service
public class UserServiceImpl implements UserService{
@Override
@Wyd //注解主要起标记作用
public void addUser() {
System.out.println("新增用户");
//int a = 1/0;
}
4.3AOP拦截注解