### **自定义注解**
```java
@Target(ElementType.注解类型)
@Retention(RetentionPolicy.生效时间)
public @interface Mylog{
}
```
###使用示例:将注解打在想要监听的切面
@Mylog
public void play(){
}
### AOP面向切面编程
```java
@Component
@Aspect
@Slf4j
@Order(10) //优先级,默认int最大值,值越小优先级越高
public class MyAspect {
//切点
// 返回值类型 包名.类名.方法名(参数名)
//*匹配任意参数 ..表示多级参数
@Pointcut("@annotation(com.health.annotation.Mylog) &&execution(* com.health.service.impl.*.findById(..))")
//上列代码为匹配com.health.service.impl包下所有类且打上了指定注解的findById方法
public void pt() {}
// 2、前置通知
// 在方法开始前执行
@Before("pt()")
public void beforeMethod(JoinPoint joinPoint) {//aspect的joinPoint类型
Signature signature = joinPoint.getSignature();//获取签名
String name1 = signature.getDeclaringType().getName();//包名.类名
String name = signature.getName();//方法名
String argString="";
Object[] args = joinPoint.getArgs();
if (args!=null&&args.length>0){
argString = Arrays.toString(args);//实参
}
System.out.println("方法名:"+name);
System.out.println("实参:"+argString);
System.out.println("全限定方法名:"+name1+"."+name);
log.warn("方法开始执行了--->");
}
//3、后置通知
// 在方法执行后执行,无论方法是否正常执行,都会执行
@After("pt()")
public void afterMethod() {
log.warn("方法执行结束了--->");
}
//4、返回通知
// 在方法正常结束后执行
@AfterReturning(value = "pt()", returning = "obj")
public Object afterReturningMethod(Object obj) {
log.warn("方法正常执行结束了,返回值为:{}" + obj);
return obj;
}
//5、异常通知
//在方法出异常时执行
@AfterThrowing(value = "pt()", throwing = "ex")
public void afterThrowingMethod(Exception ex) {
log.warn("方法出异常执行了,异常信息为:{}", ex);
}
‘
//6、全局通知
@Around("pt()")
public Object aroundMethod(ProceedingJoinPoint pjp){
try {
long start =System.currentTimeMillis();
Object result = pjp.proceed();
long end =System.currentTimeMillis();
System.out.println("方法执行了"+(end-start)+"ms");
return result;
} catch (Throwable e) {
e.printStackTrace();
System.out.println("方法出异常了,异常信息为"+e.getMessage());
}finally {
System.out.println("方法执行结束了");
}
return null;
}
}
```
自定义注解和aop面向切面编程
最新推荐文章于 2024-08-23 09:58:44 发布