Spring AOP
AOP实现原理:代理模式,又可分为静态代理和动态代理,,动态代理方式又可分为基于接口和基于继承的代理
静态代理:客户端访问目标对象时,通过代理对象进行访问,在代理对象中,可进行别的业务处理,不过在代理对象中,要实例化目标对象,这样就导致代码重复,这时引入了动态代理的方式。
动态代理,基于接口的代理和基于继承的代理,分为JDK代理和cglib代理
如果目标对象实现了接口,默认使用jdk动态代理,如果目标对象没有实现接口,则采用cglib进行动态代理,也可强制使用cglib代理方式
在aop的实现类里添加如下接口可实现cglib代理
@EnableAspectJAutoProxy(proxyTargetClass=true) //将代理方式使用cglib方式实现,不使用jdk方式,不过一般在配置文件中配置
配置文件方式: <aop:aspectj-autoproxy proxy-target-class="true"/>
在spring-boot中只需要导入
<!--aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
//@Order(value=1) 定义为第一个
@Aspect @Component("testAop") //@EnableAspectJAutoProxy(proxyTargetClass=true) //将代理方式使用cglib方式实现,不使用jdk方式,不过一般在配置文件中配置 public class TestAop { private static final Logger log = Logger.getLogger(TestAop.class); //第一个*--任意返回值 //@Pointcut("execution(* com.service.impl.UserInfoServiceImpl.*(..))") public void admin() {} //@Before("admin()") public void before(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); //获取方法名 Object [] args = joinPoint.getArgs(); //获取参数值 log.info("----方法名:"+methodName+"-------args:"+Arrays.asList(args)); log.info("我是aop中的before方法--------"); } // 方法调用之后执行 ,不管方法是否报错都会执行. /*@After(value="admin()") public void after() { }*/ //returning:返回方法调用结束后的返回值 //要求方法正常结束,不抛异常 /*@AfterReturning(value="admin()" ,returning="result") public void afterReturning(JoinPoint joinPoint, Object result) { log.info("结束后返回----"+result); }*/ //返回报错执行 出错执行 /*@AfterThrowing(value="admin()") public void agterThrowing() { }*/ //环绕通知,包含前面的4个注解 //@Around(value="admin()") public Object doBatis(ProceedingJoinPoint pjp) { Object obj = null; String a = get11(); try { log.info("方法执行之前....before"); if(a !=null) { return ""; } else { obj = pjp.proceed(); //执行目标方法 } log.info("方法执行之后返回afterRetruning ...."); } catch (Throwable e) { log.info("方法报错----afterThrounding"); e.printStackTrace(); } finally { log.info("after"); } log.info("返回的obj:"+obj); return obj; } }

浙公网安备 33010602011771号