1,定义一个注解,
2,定义一个切面扫拦截描这个注解即可---切面的定义可以用注解@Aspect,也可以用配置,切面可以扫描注解,包路劲
4,point.proceed();就是切点--注解所在的方法,在切面中执行(这样把目标方法放在切面通知中执行)
3,其他的地方用(写到需要监控的业务方法上(每个方法都需要写)(@ExceptionHandler不需要写在目标方法上,而是写在通知处理方法上--不需要写在监控方法上))
如果自定义注解来处理方法的异常,这回这个方法每次执行都会放在切面中的通知一起执行,然后用通知中处理异常的方式,没有异常不执行,
有异常就catch到按照通知中的逻辑处理
/** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface ErrorException { int code() default 0;//参数 } /** * ErrorExceptionAspect: * * @author yangzhenlong * @since 2016/7/21 */ @Component @Aspect public class ErrorExceptionAspect { //@Before("execution(* com.sarkuya.service..*.*(..))") @Pointcut(value = "@annotation(com.mlxs.mvc.anno.ErrorException)") private void pointcut() { } @Around(value = "pointcut() && @annotation(errorExecption)") public Object around(ProceedingJoinPoint point, ErrorException errorExecption){ System.out.println("---->around"); //注解参数 System.out.println("注解参数:"+ errorExecption.code()); //当前拦截的类和方法: Class clazz = point.getTarget().getClass(); Method method = ((MethodSignature) point.getSignature()).getMethod(); String codeName = clazz.getSimpleName()+"_"+method.getName(); System.out.println("query param---->"+codeName); //方法返回结果 Object result = null; Object args = Arrays.asList(point.getArgs()); try { //执行方法(可以在方法前后添加前置和后置通知) result = point.proceed(); //校验结果 result = validateResult(result); } catch (Throwable e) { //记录日志 System.out.println(codeName + "()方法异常:" + e); //打印堆栈信息 e.printStackTrace(); //设置返回信息 result = "结果:抛了异常了。。-----------------------"+e.getMessage()+",原因:"+e.getCause(); } //返回通知 return result; } /** * 方法执行后 * @param joinPoint * @param result */ @AfterReturning(value = "pointcut() && @annotation(errorExecption)", returning = "result") public Object afterReturning(JoinPoint joinPoint, ErrorException errorExecption, Object result){ System.out.println("---->afterReturning"); String methodName = joinPoint.getSignature().getName(); System.out.println("The method " + methodName + " return with " + result); if(result instanceof Boolean){ if(!((Boolean) result)){ result = "error----result is false"; } }else{ if(result == null){ result = "error----result is null"; } } return result; } /** * 方法执行后 * @param joinPoint * @param ex */ @AfterThrowing(value = "pointcut() && @annotation(errorExecption)", throwing = "ex") public void afterThrowing(JoinPoint joinPoint, ErrorException errorExecption, Exception ex){ System.out.println("eeeee--->afterThrowing"); String methodName = joinPoint.getSignature().getName(); System.out.println("The method " + methodName + "occurs exception: " + ex); } private Object validateResult(Object result){ if(result instanceof Boolean){ if(!((Boolean) result)){ System.out.println("error----result is false"); result = "error:false"; } }else{ if(result == null){ System.out.println("error----result is null"); result = "error:null"; } } return result; } } /** * _Test: * * @author yangzhenlong * @since 2016/7/21 */ @Component("test") public class _Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring/applicationContext.xml"); _Test obj = (_Test) context.getBean("test"); System.out.println("==========>"+obj.test()); //System.out.println("==========>"+obj.test2()); } @ErrorException(code = 100) public Object test(){ System.out.println("---test---"); int a = 10/0; return 20; } @ErrorException(code = 22) public Object test2(){ System.out.println("---test2---"); //int a = 10/0; return false; } } ---->around 注解参数:100 query param---->_Test_test ---test--- _Test_test()方法异常:java.lang.ArithmeticException: / by zero ---->afterReturning The method test return with 结果:抛了异常了。。-----------------------/ by zero,原因:null ==========>结果:抛了异常了。。-----------------------/ by zero,原因:null java.lang.ArithmeticException: / by zero at com.mlxs.mvc.anno._Test.test(_Test.java:28) at com.mlxs.mvc.anno._Test$$FastClassBySpringCGLIB$$cc5ae48c.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at com.mlxs.mvc.anno.ErrorExceptionAspect.around(ErrorExceptionAspect.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) at com.mlxs.mvc.anno._Test$$EnhancerBySpringCGLIB$$cbf2effd.test(<generated>) at com.mlxs.mvc.anno._Test.main(_Test.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
相关推荐
接下来,我们可以创建一个类并使用自定义注解标记某个字段: ```java public class AnnotationDemo { @MyCustomAnnotation("测试注解") private String testField; } ``` 现在,我们可以使用反射机制来获取这个...
自定义注解的定义类似于接口,但使用`@interface`关键字。例如,我们可以定义一个`@SoldOut`注解,表示某种商品售罄: ```java import java.lang.annotation.Retention; import java.lang.annotation....
本文将详细介绍如何创建、使用以及处理自定义注解。 ### 一、自定义注解的定义 自定义注解的定义语法类似于接口,但用`@interface`关键字来声明。下面是一个简单的自定义注解示例: ```java public @interface ...
`src`目录则是源代码存放的地方,其中可能包含自定义注解的定义以及使用这些注解的代码。 总之,Java自定义注解验证是增强代码规范性和健壮性的有效手段,通过自定义注解可以实现更精细的代码管理和验证。本案例中...
在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...
自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...
例如,我们可以使用自定义注解来描述方法的参数信息,以便在运行时获取这些信息。 ```java @Sample(value="I'm here.") public void anyName() { // ... } ``` 在上面的例子中,我们使用了 `Sample` 注解来描述 `...
在Java编程语言中,自定义注解是一种强大的...通过定义、使用、处理和集成自定义注解,我们可以构建更灵活、更强大的应用程序。在实际项目中,合理利用自定义注解能够显著提升开发效率,减少代码冗余,增强框架扩展性。
自定义注解动态校验则是在编程环境中,通过使用自定义注解来定义数据验证规则。注解是一种元数据,可以提供有关代码的附加信息,通常用于简化代码并提高可读性。在导入Excel数据时,开发者可以创建自定义注解,这些...
要创建自定义注解,我们需要使用`@interface`关键字。例如,我们可以定义一个名为`MyComponent`的注解: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java....
在使用自定义注解时,可以使用反射API来读取和处理这些注解。例如,`java.lang.reflect.AnnotatedElement`接口提供了访问注解的方法。 在实际开发中,注解广泛应用于依赖注入、持久化框架、测试框架等领域。例如,...
在Java开发中,自定义注解是一种非常强大的工具,它允许我们为代码添加元数据,以便在运行时或编译时进行处理。本示例中,“自定义注解实现拦截SQL”是关于如何通过注解来动态修改执行的SQL语句,以在其中增加特定的...
接下来,我们将讨论如何在Spring中使用`@ComponentScan`注解来扫描并处理自定义注解。`@ComponentScan`是Spring的核心组件扫描机制,它会遍历指定包及其子包下的所有类,寻找标记了Spring的组件注解(如`@Component`...
例如,创建一个名为`@Cacheable`的自定义注解,用于缓存方法的返回结果: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Cacheable { String cacheName() default ...
3. **使用**: 在代码中,可以将自定义注解应用于目标元素,如: ```java public class MyClass { @MyAnnotation(value = "Hello, World!") public void myMethod() { // ... } } ``` ### 三、注解处理器 ...
在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
2. 使用注解:在需要监控的方法上使用自定义注解,指定相关指标。 ```java @Service public class MyService { @MyMonitor(metricName = "myServiceCall", importance = 5) public void performTask() { // 方法...
本示例主要探讨如何在Spring中创建和使用自定义注解,以及与AOP结合实现动态代理。 首先,我们需要了解自定义注解的基本结构。在Java中,自定义注解是以`@interface`关键字定义的。例如,我们可以创建一个名为`...
使用自定义注解后,我们需要编写处理这些注解的逻辑,这通常是通过注解处理器或者在运行时通过反射实现的。 接下来,我们讨论Spring的BeanPostProcessor。BeanPostProcessor是Spring框架的核心组件之一,它提供了一...