首页 > 编程语言 >Spring AOP源码(一):源码分析示例

Spring AOP源码(一):源码分析示例

时间:2022-12-27 20:11:49浏览次数:48  
标签:示例 Spring System 源码 result signature println public out

1、aop.xml配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4       xmlns:aop="http://www.springframework.org/schema/aop"
 5       xsi:schemaLocation="http://www.springframework.org/schema/beans
 6        http://www.springframework.org/schema/beans/spring-beans.xsd
 7        http://www.springframework.org/schema/aop
 8        http://www.springframework.org/schema/aop/spring-aop.xsd
 9 ">
10    <bean id="logUtil" class="com.snails.aop.xml.util.LogUtil" ></bean>
11    <bean id="mathCalculator" class="com.snails.aop.xml.service.MathCalculator" ></bean>
12    <aop:config>
13       <aop:aspect ref="logUtil">
14          <aop:pointcut id="myPoint" expression="execution( Integer com.snails.aop.xml.service.MyCalculator.*  (..))"/>
15          <aop:around method="around" pointcut-ref="myPoint"></aop:around>
16          <aop:before method="start" pointcut-ref="myPoint"></aop:before>
17          <aop:after method="logFinally" pointcut-ref="myPoint"></aop:after>
18          <aop:after-returning method="stop" pointcut-ref="myPoint" returning="result"></aop:after-returning>
19          <aop:after-throwing method="logException" pointcut-ref="myPoint" throwing="e"></aop:after-throwing>
20       </aop:aspect>
21    </aop:config>
22    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
23 </beans>

2、logUtil实现

 1 public class LogUtil {
 2 
 3    public void myPointCut(){}
 4 
 5    private int start(JoinPoint joinPoint){
 6       //获取方法签名
 7       Signature signature = joinPoint.getSignature();
 8       //获取参数信息
 9       Object[] args = joinPoint.getArgs();
10       System.out.println("log---"+signature.getName()+"方法开始执行:参数是"+ Arrays.asList(args));
11       return 100;
12    }
13 
14    public static void stop(JoinPoint joinPoint,Object result){
15       Signature signature = joinPoint.getSignature();
16       System.out.println("log---"+signature.getName()+"方法执行结束,结果是:"+result);
17    }
18 
19    public static void logException(JoinPoint joinPoint,Exception e){
20       Signature signature = joinPoint.getSignature();
21       System.out.println("log---"+signature.getName()+"方法抛出异常:"+e.getMessage());
22    }
23 
24    public static void logFinally(JoinPoint joinPoint){
25       Signature signature = joinPoint.getSignature();
26       System.out.println("log---"+signature.getName()+"方法执行结束。。。。。over");
27 
28    }
29 
30    public Object around(ProceedingJoinPoint pjp) throws Throwable {
31       Signature signature = pjp.getSignature();
32       Object[] args = pjp.getArgs();
33       Object result = null;
34       try {
35          System.out.println("log---环绕通知start:"+signature.getName()+"方法开始执行,参数为:"+Arrays.asList(args));
36          //通过反射的方式调用目标的方法,相当于执行method.invoke(),可以自己修改结果值
37          result = pjp.proceed(args);
38 //            result=100;
39          System.out.println("log---环绕通知stop"+signature.getName()+"方法执行结束");
40       } catch (Throwable throwable) {
41          System.out.println("log---环绕异常通知:"+signature.getName()+"出现异常");
42          throw throwable;
43       }finally {
44          System.out.println("log---环绕返回通知:"+signature.getName()+"方法返回结果是:"+result);
45       }
46       return result;
47    }
48 
49 }

3、创建被代理类MathCalculator

 1 public class MathCalculator {
 2 
 3    public Integer add(Integer i, Integer j) throws NoSuchMethodException {
 4       Integer result = i+j;
 5       return result;
 6    }
 7 
 8    @Override
 9    public String toString() {
10       return "super.toString()";
11    }
12 
13 }

4、测试入口

1 public static void main(String[] args) throws Exception {
2         ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml");
3         MyCalculator bean = ac.getBean(MyCalculator.class);
4         System.out.println(bean);
5         bean.add(1,1);
6     }

标签:示例,Spring,System,源码,result,signature,println,public,out
From: https://www.cnblogs.com/RunningSnails/p/17008895.html

相关文章

  • SpringBoot - 全局异常处理@RestControllerAdvice,@ControllerAdvice,@ExceptionHandler
    @RestControllerAdvice与@ControllerAdvice 作用:告诉框架这是一个异常处理类,@RestControllerAdvice返回的是响应体范围:类上 @ExceptionHandler 作用:发生特定类型的......
  • SpringBoot - 目录
    SpringBoot-@Configuration,@Bean,@Scope组件注入容器SpringBoot-MVC三层架构注解注入到容器中与从IOC容器获取实例注解SpringBoot-配置包扫描注解@ComponentScanS......
  • AS3 IOC框架Spring Actionscript 的使用总结
    SpringActionscript 是众多围绕依赖注入提供解决方案的Flex控制反转框架之一AS3下经典的IOC框架有SpringActionScript、Parsley、Flicc和Swiz,由于我对JAVAspringIOC机......
  • Nacos1.4源码(1):客户端注册源码
    搭建环境搭建Nacos服务端环境从github上下载nacos1.4源码下来:https://github.com/alibaba/nacos下载下来,源码编译好,直接idea运行com.alibaba.nacos.Nacos类就行:那我......
  • 我是怎么调试 Element UI 源码的
    ​​上篇文章​​写了怎么调试antd的源码,反响很不错:但很多小伙伴是写Vue的,可能平时用的是ElementUI的组件库,所以这篇文章就来讲下怎么调试ElementUI的源码。首先,......
  • Spring安全和角度(二)
    使用OAuth2进行单点登录在本节中,我们继续我们的讨论如何使用弹簧安全跟角在“单页应用程序”中。在这里,我们展示如何使用春季安全密钥䋰春云将我们的API网关扩展到后端......
  • SpringBoot - 自定义拦截器HandlerInterceptor
    1.实现HandlerInterceptor接口/***自定义拦截器*/publicclassMyInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(Htt......
  • SpringBoot - 转换器Convert与SpringBoot支持的返回类型
    1.自定义转换器@Configuration(proxyBeanMethods=false)publicclassAppConfig{@BeanpublicWebMvcConfigurergetWebMvcConfigurer(){returnn......
  • Spring Boot Docker 应用程序
    许多人使用容器来包装他们的SpringBoot应用程序,构建容器并不是一件简单的事情。这是针对SpringBoot应用程序开发人员的指南,容器并不总是开发人员的良好抽象。它们迫使......
  • Kubernetes 上的Spring
    在构建在云中运行的Java应用程序时,弹簧和弹簧靴显然是最受欢迎的.同样越来越明显的是,Docker和Kubernetes等技术在春季社区中发挥重要作用.将SpringBoot应用程序打包在......