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;   } }

 

posted @ 2018-06-15 11:03  qqq齐  阅读(100)  评论(0)    收藏  举报