spring aop

狂风中的少年 提交于 2019-12-21 11:08:34

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

通知类型

package com.aspectj;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect //该类是一个切面
public class MyAspectJ {
    Logger logger = Logger.getLogger(MyAspectJ.class);
    // 切入点: 假设我这个切入点指定的是 service包下面的所有的方法
    // 第一个宽字符 * 匹配 任何返回类型,第二个宽字符 * 匹配 任何方法名,最后的参数 (..) 表达式匹配任意数量任意类型的参数,也就是说该切点会匹配类中所有方法的调用。
    @Pointcut("execution(* com.service.*..* (..))")
    public void qrd(){}
    // 前置增强, 要给目标方法织入什么的业务
    @Before("qrd()")
    public void beforeMsg(JoinPoint joinPoint){// joinpoint: 连接点 ;能够获取目标方法的一些信息
        logger.info("===start===="+joinPoint.getTarget()+"执行:"+joinPoint.getSignature().getName()+"() 方法");
    }
    // 后置增强
    @After("qrd()") //无论如何方法结束都会进行日志打印
    public void afterMsg(JoinPoint joinPoint){
        logger.info("===end====" + joinPoint.getTarget() + "执行:" + joinPoint.getSignature().getName() + "() 方法");
    }
     //异常通知
    @AfterThrowing("qrd()")
    public void exMsg(){
        logger.info("====异常通知====");
    }
    // 环绕通知
    @Around("qrd()")
    public Object aroundMsg(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.info("===start===="+joinPoint.getTarget()+"执行:"+joinPoint.getSignature().getName()+"() 方法");
        Object o = joinPoint.proceed();
        logger.info("===end====" + joinPoint.getTarget() + "执行:" + joinPoint.getSignature().getName() + "() 方法");
        return o;
    }
//    @AfterReturning("qrd()") // 方法必须正常返回才会执行
//    // @After("qrd()") //无论如何方法结束都会进行日志打印
//    public void afterMsg(JoinPoint joinPoint){
//        logger.info("===========end=====" + joinPoint.getTarget() + "执行:" + joinPoint.getSignature().getName() + "() 方法");
//    }
}

基于注解才能进行的通知

注解

package com.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {

}

切面

package com.aspectj;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect //该类是一个切面
public class MyAspectJ {
    Logger logger = Logger.getLogger(MyAspectJ.class);

    @Pointcut("@annotation(com.anno.MyAnno)") //注解才进行通知的切入点 ok了
    public void qrdAnno(){}

    @Before("qrdAnno()")
    public void beforeAnnoMsg(JoinPoint joinPoint){
        System.out.println("只有执行注解才会切得增强" + joinPoint.getSignature().getName());
    }
}

配置

package com.service;

import com.anno.MyAnno;
import com.dao.OrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    OrderDao orderDao;
    @Override
    @MyAnno
    public void buy(String meat) {
        orderDao.choose(meat);
        System.out.println("你已经购买了");
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!