【推荐】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("你已经购买了");
}
}
来源:oschina
链接:https://my.oschina.net/jacksonmike/blog/3145578