==================
Spring AOP注解配置
==================
1 创建项目
IDEA
新建项目
Maven
名称:AnnotationAOP
组ID:cn.tedu
工件ID:annotationaop
版本:1.0.0
2 添加依赖
org.springframework
spring-context
5.3.14
org.springframework
spring-aspects
5.3.14
3 创建包
cn.tedu.annotationaop
4 配置文件
在/src/main/resources目录下创建applicationContext.xml的文件:
保存为模板。
将base-package属性设置为实体类所在包路径cn.tedu.annotationaop。
5 切入点类
在cn.tedu.annotationaop.util包中创建类:
@Component
public class Pointcuts {
public void pointcut(boolean throwException) {
System.out.println("-切入点-");
if (throwException)
throw new NullPointerException();
}
}
6 切面类
在cn.tedu.annotationaop.aspect包中创建类:
@Component
@Aspect
public class Advices {
@Before("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))")
public void before() {
System.out.println("前置增强");
}
@After("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))")
public void after() {
System.out.println("后置增强");
}
@AfterThrowing("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))")
public void after_throwing() {
System.out.println("异常增强");
}
@AfterReturning("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))")
public void after_returning() {
System.out.println("返回增强");
}
@Around("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环增切前");
Object retval = pjp.proceed(); // 执行切入点
System.out.println("环增切后");
return retval;
}
}
或
@Component
@Aspect
public class Advices {
@Pointcut("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))")
public void pointcut() {}
@Before("pointcut()")
public void before() {
System.out.println("前置增强");
}
@After("pointcut()")
public void after() {
System.out.println("后置增强");
}
@AfterThrowing("pointcut()")
public void after_throwing() {
System.out.println("异常增强");
}
@AfterReturning("pointcut()")
public void after_returning() {
System.out.println("返回增强");
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环增切前");
Object retval = pjp.proceed(); // 执行切入点
System.out.println("环增切后");
return retval;
}
}
7 测试类
在cn.tedu.annotationaop.test包中创建类:
public class AdvicesTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Pointcuts pointcuts = context.getBean("pointcuts", Pointcuts.class);
pointcuts.pointcut(true);
}
}
环增切前
前置增强
-切入点-
异常增强
后置增强
Exception in thread "main" java.lang.NullPointerException
...
public class AdvicesTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Pointcuts pointcuts = context.getBean("pointcuts", Pointcuts.class);
pointcuts.pointcut(false);
}
}
环增切前
前置增强
-切入点-
返回增强
后置增强
环增切后
例程:AnnotationAOP
与XML文件相比,通过注解配置AOP显然更加方便,但只能在源代码上加注解。
- 如果切面类是自己写的类,建议使用注解配置AOP;
- 如果切面类来自第三方包,只能通过XML文件配置AOP。