`
xieyj
  • 浏览: 101869 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

spring中链式处理

阅读更多

  近来复习了一下spring代码,感觉好的代码还是需要经常看看,从中还是能学到很多东西,虽然我并不看好开源的市场,总觉得开源的东西过于理想,但正因为开源,使我辈等能从中学到一流程序员的设计思路,还是非常感激。

  由于项目的需要,不用java也有一年多的时间,个人还是经常看看java项目的源码,从中吸取其中的思路,在项目中也剽窃了一些。个人觉得思路是相通的,不必在乎编程语言。

  在spring当中,个人当年曾经剽窃了链式处理的思路,用于一个订单审核的流程当中,所以拿出来分享。

  在JdkDynamicAopProxy当中

  invoke方法里面

  。。。。

   List chain = this.advised.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(
     this.advised, proxy, method, targetClass);

   。。。。

 

   invocation = new ReflectiveMethodInvocation(
      proxy, target, method, args, targetClass, chain);

    // proceed to the joinpoint through the interceptor chain
    retVal = invocation.proceed();

 

    而 ReflectiveMethodInvocation的proceed()方法

    if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
   return invokeJoinpoint();
  }

  Object interceptorOrInterceptionAdvice =
      this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
  if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {
 

   InterceptorAndDynamicMethodMatcher dm =
       (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;
   if (dm.methodMatcher.matches(this.method, this.targetClass, this.arguments)) {
    return dm.interceptor.invoke(this);
   }
   else {
        return proceed();
   }
  }
  else {
    return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
  }

  请注意上面红色粗体部分,上面的currentInterceptorIndex为类成员

 

  这一部分和MethodInterceptor一起组成了链式处理,下面是实现MethodInterceptor一个例子

 

public class SpringMethodInterceptor implements MethodInterceptor {

public Object invoke(MethodInvocation invo) throws Throwable { 

   // MethodInvocation invo为上面this传入
   Object[] object = invo.getArguments();
   try{

    System.out.println("信息1");
   
    Object returnObject = invo.proceed();
   
    System.out.println("信息2");
   
    return returnObject;
   }
   catch(Throwable throwable){
   }
   return object;
}

 在上面的 invo.proceed()执行时候,将currentInterceptorIndex加1继续往后执行下去。

 这种链式处理方式使用比较广泛,在java servlet的Filter(过滤器)其实也是使用这种技术。其好处是每个处理比较清晰,并且在某个处理不通过时候,很容易将链结束,不再往后执行。

 

0
2
分享到:
评论

相关推荐

    spring aop之链式调用的实现

    Spring AOP 之链式调用的实现 在 software development 中,Aspect-Oriented Programming(AOP)是一种编程范式,旨在将横切关注点从业务逻辑中分离出来,使得代码更加模块化、灵活和可维护。Spring AOP 是一种基于...

    Spring-5.0.0-官方中文文档

    5. **增强的HTTP客户端**:Spring 5的RestTemplate被替换为WebClient,这是一个反应式的HTTP客户端,支持链式调用和更丰富的错误处理,适合处理复杂的异步请求。 6. **Java 8和更高版本的支持**:Spring 5全面拥抱...

    spring-kafka 整合官方文档

    例如Kafka客户端版本更新、JSON处理改进、容器停止错误处理器、暂停/恢复容器功能、有状态重试机制、客户端ID配置、日志记录偏移量提交、默认的Kafka处理器、响应式Kafka模板、链式事务管理器、事务回滚后的处理、从...

    Spring Integration源码

    2. **链式处理**:通过 Channel Interceptors,消息在通道中的传递可以实现链式处理,每个拦截器可以执行额外的操作,如日志记录、事务管理等。 3. **线程模型**:了解 Spring Integration 如何管理线程,包括单...

    spring-webflux实战.zip

    5. **错误处理**:在Spring WebFlux中,错误处理是内置的,通过异常处理器和自定义错误视图来提供友好的错误反馈。开发者可以通过定义全局异常处理器来统一处理各种异常情况。 6. **测试**:Spring WebFlux提供了...

    spring-integration2.03

    - **流式处理**:数据可以通过一系列链式处理组件进行转换和路由,形成数据处理流水线。 - **错误处理**:提供了丰富的错误处理机制,包括异常处理和重试策略。 - **配置灵活性**:基于 Java 或 XML 配置,适应...

    spring-kafka整合.docx

    10. ChainedKafkaTransactionManager:该版本中,链式 Kafka 事务管理器的实现,提高了系统的可靠性和稳定性。 Spring for Apache Kafka的优点 1. 简洁易用:Spring for Apache Kafka提供了一个简洁、易用的API,...

    jQuery Spring MVC

    将两者结合使用,可以构建出高效、响应式的前端界面,同时利用Spring MVC的强大功能处理后端业务逻辑。本文将深入探讨如何将jQuery与Spring MVC进行有效整合,以及一个使用jqGrid的实例。 ### jQuery 简介 jQuery ...

    spring-integration

    5. **流处理(Flow Processing)**:Spring Integration支持定义数据处理的工作流,允许通过链式调用多个处理步骤,每个步骤都由特定的处理器组件完成。 6. **事件驱动架构(Event-Driven Architecture)**:Spring...

    springCloud

    Spring Cloud简介 Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud ...

    重试框架spring-retry以及guava-retry的使用

    重试框架在IT行业中扮演着重要的角色,尤其是在网络通信、数据处理等易受不稳定因素影响的场景下。本文将深入探讨两个常用的重试框架:Spring Retry和Guava Retry,并通过一个名为`retry-starter`的Spring Boot项目...

    使用CGLIB模拟spring的拦截器

    在实际应用中,我们可能会有多个拦截器,这时候可以将这些拦截器组织成一个链式结构,按照特定顺序依次执行。这就需要我们设计一个拦截器管理类来维护这个链,并在调用时按照正确的顺序执行。 总的来说,通过CGLIB...

    Spring-RMI (RMI调用, HTTP调用)

    综上所述,Spring-RMI和HTTP调用都是Spring框架中处理远程通信的重要方式。RMI适合于Java环境下的高效通信,而HTTP调用则具有更好的跨平台性和灵活性。在实际项目中,选择哪种方式取决于具体需求和环境。

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    - 使用双端队列(Deque)实现数据库的链式切换,这在处理需要顺序访问或循环访问多个数据源的场景中非常有用。 5. **事务内切换数据源**: - 引入了一个创新的特性,即在同一个事务内支持数据源的切换,并且兼容...

    T1 spring-IOCjQueryt1.Jbpm设计t2.流程持久化t3整合spring

    接着,jQuery是前端开发中的明星库,它简化了JavaScript的API,如通过选择器选取DOM元素,使用链式调用进行操作,以及提供丰富的插件支持。jQuery还简化了Ajax请求,使得页面异步更新更加方便。在实际项目中,jQuery...

    spring 响应式编程的入门案例

    在本文中,我们将深入探讨Spring响应式编程的基本概念,以及如何通过实际案例`order-service`、`customer-service`、`message`和`account-service`来入门。 1. **什么是响应式编程** 响应式编程是一种编程范式,它...

    Spring+SpringMVC+MyBatis+SpringBoot视频05

    视频内容可能涵盖了如何创建 Spring Boot 应用中的拦截器(Interceptor),用于处理如登录验证这样的安全问题。拦截器可以在请求被控制器处理之前或之后执行逻辑,比如检查用户是否已登录,确保只有授权的用户才能...

    spring-boot-async-test.zip

    在Spring Boot框架中,异步处理是提升应用性能的关键特性之一。它允许应用程序在不阻塞主线程的情况下执行耗时的操作,从而提高响应速度。在给定的"spring-boot-async-test.zip"压缩包中,包含了一个示例,演示了两...

    微服务架构、springcloud介绍PPT

    - 链式模式:请求按顺序经过多个服务,每个服务处理其职责范围内的任务。 - 分支模式:根据条件将请求路由到不同的服务,实现动态路由或多路径处理。 - 数据共享模式:通过事件驱动架构或共享数据库实现不同服务间的...

Global site tag (gtag.js) - Google Analytics