- 切点
切点是一个接口,切点表达式定义的方法(切点的方法)执行的时候触发通知
切点不需要使用 aspectj注解声明,只需要注入到spring上下文bean。
- 切面
通知切面在切点方法执行前后做一些动作。
使用 aspectj注解 (@Aspect 加在类上) 声明一个切面。
切点表达式加在方法上(有5种) 这样在切点方法执行的时候 按5中顺序执行切面的方法
//需要加的依赖
dependencies {
compile("org.springframework:spring-context:${springVersion}")
// https://mvnrepository.com/artifact/org.springframework/spring-aop
compile("org.springframework:spring-aop:${springVersion}")
// https://mvnrepository.com/artifact/org.aspectj/aspectjrt
compile("org.aspectj:aspectjrt:${aspectJVersion}")
// https://mvnrepository.com/artifact/org.aspectj/aspectjweaver
compile("org.aspectj:aspectjweaver:${aspectJVersion}")
// https://mvnrepository.com/artifact/com.google.code.gson/gson
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile("org.springframework:spring-test:${springVersion}")
}
//切点
@Component
public class Film implements Performance {
@Override
public void perform() {
System.out.println("电影播放");
}
}
//切点的实现类
@Component
public class Film implements Performance {
@Override
public void perform() {
System.out.println("电影播放");
}
}
//切面
@Component
@Aspect
public class Audience {
//使用Pointcut注解,可以减少重复的声明切点表达式 (对比@Before(切点表达式))
@Pointcut("execution(** aspectj.Performance.perform(..))")
public void performance(){}
//使用上面的方法代替切点表达式
@Before("performance()")
public void silenceCellPhone(){
System.out.println("Silencing cell phone");
}
}
tips
- idea是否自动导入 不是自动导入右下角提示 autocomplete
- 导入依赖的2种方式
//可以统一用 gradle.properties中的属性来管理version
compile("com.google.code.gson:gson:${gsonVersion}")
//mvn提供的方式
testCompile group: 'junit', name: 'junit', version: '4.12'
- within()和bean()指示器 还有 and or not(应用于切点表达式)