本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
使用前提:Spring的AOP是基于JDK动态代理和CGlib代理实现的,所以目标对象必须要有父类或实现了接口才能被代理。
导入相关jar包
基于纯配置文件的方式
要使用配置文件的方式需要在applicationContext.xml文件中进行配置
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--只需要将目标类与切面类加入容器中就行,也可使用注解的方式-->
//切面类
<bean id="aspectAop" class="com.aop.AspectAop"/>
//目标类
<bean id="targetAop" class="com.sercie.TargetAop"/>
//配置aop
<aop:config>
<!--配置切点,定义切点表达式-->
<aop:pointcut id="pointcut1" expression="execution(* com.ecjtu.aop.TargetAop.*(..))"/>
<!--定义切面-->
<aop:aspect id="aspect1" ref="aspectAop">
<!--最终通知,无论目标方法是否有异常都会执行-->
<aop:after method="log" pointcut-ref="pointcut1" />
<!--前置通知-->
<aop:before method="init" pointcut-ref="pointcut1" />
<!--异常通知,目标方法抛出异常时执行-->
<aop:after-throwing method="throwing" pointcut-ref="pointcut1"/>
<!--后置通知,目标方法抛出异常时不执行-->
<aop:after-returning method="returning" pointcut-ref="pointcut1"/>
<!--环绕通知,方法中需要参数-->
<aop:around method="around" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
</beans>
基于纯注解的方式
切面类与目标类都需要在Spring容器中 切面类
java
package com.aop;
@Component
@Aspect
public class AspectAop {
@Pointcut("execution(* com.ecjtu.aop.*.*(..))")
public void pointcut(){};
@After("pointcut()")
public void log(){
System.out.println("最终通知");
}
@Before("pointcut()")
public void init(){
System.out.println("前置通知");
}
@AfterThrowing("pointcut()")
public void throwing(){
System.out.println("异常通知");
}
@AfterReturning("pointcut()")
public void returning(){
System.out.println("后置通知");
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知,前置");
Object proceed = joinPoint.proceed(joinPoint.getArgs());
System.out.println("环绕通知,后置");
return proceed;
}
}
配置类
java
@Configuration //若被导入主配置类中则可加可不加这个注解
@ComponentScan(basePackages = {"com.aop"})//扫描目标类与切面类所在的包
@EnableAspectJAutoProxy//开启自动代理,即注解的方式
public class MyConfig {
}