【Spring】Spring中的设计模式

这篇具有很好参考价值的文章主要介绍了【Spring】Spring中的设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

责任链模式

Spring中的Aop的通知调用会使用责任链模式

责任链模式介绍

角色:
	抽象处理者(Handler)
	具体处理者(ConcreteHandler1)
	客户类角色(Client)

Spring源码介绍

spring中Aop的责任链模式,相对于传统的责任链模式做了一定的改造。
传统的设计模式,抽象处理者会有一个方法设置和获取具体处理者的下一个处理者的方法。
如:

public abstract class Handler {
	private Handler next;
	public Handler getNext() {
		return next;
	}
	public void setNext(Handler next) {
	this.next = next;
	}
	//处理请求的方法
	public abstract void handleRequest(String request);
}

但是Spring中的责任链模式没有这两个方法,而是抽出一个公共的处理方法,方法内有数组和下标来完成链式。

public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Cloneable {
	// 环绕通知类
	protected final List<?> interceptorsAndDynamicMethodMatchers;
	// 下标
	private int currentInterceptorIndex = -1;
/**
	 * 递归获取通知,然后执行
	 * @return
	 * @throws Throwable
	 */
	@Override
	@Nullable
	public Object proceed() throws Throwable {
		// We start with an index of -1 and increment early.
		// 从索引为-1的拦截器开始调用,并按序递增,如果拦截器链中的拦截器迭代调用完毕,开始调用target的函数,这个函数是通过反射机制完成的
		// 具体实现在AopUtils.invokeJoinpointUsingReflection方法中
		if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
			return invokeJoinpoint();
		}

		// 获取下一个要执行的拦截器,沿着定义好的interceptorOrInterceptionAdvice链进行处理
		Object interceptorOrInterceptionAdvice =
				this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
		if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {
			// Evaluate dynamic method matcher here: static part will already have
			// been evaluated and found to match.
			// 这里对拦截器进行动态匹配的判断,这里是对pointcut触发进行匹配的地方,如果和定义的pointcut匹配,那么这个advice将会得到执行
			InterceptorAndDynamicMethodMatcher dm =
					(InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;
			Class<?> targetClass = (this.targetClass != null ? this.targetClass : this.method.getDeclaringClass());
			if (dm.methodMatcher.matches(this.method, targetClass, this.arguments)) {
				return dm.interceptor.invoke(this);
			}
			else {
				// Dynamic matching failed.
				// Skip this interceptor and invoke the next in the chain.
				// 如果不匹配,那么proceed会被递归调用,知道所有的拦截器都被运行过位置
				return proceed();
			}
		}
		else {
			// It's an interceptor, so we just invoke it: The pointcut will have
			// been evaluated statically before this object was constructed.
			// 普通拦截器,直接调用拦截器,将this作为参数传递以保证当前实例中调用链的执行
			return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
		}
	}
}

其中的最后一句

// 普通拦截器,直接调用拦截器,将this作为参数传递以保证当前实例中调用链的执行
return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);

MethodInterceptor就是抽象处理者

@FunctionalInterface
public interface MethodInterceptor extends Interceptor {

	/**
	 * 
	 */
	Object invoke(MethodInvocation invocation) throws Throwable;
}

具体的执行者有
AspectJAfterAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJMethodBeforeAdvice、AspectJAroundAdvice

工厂模式

Spring中的获取Bean就是工厂模式,如:BeanFactory获取

工厂模式介绍

角色:
	抽象产品
	具体产品
	抽象工厂
	具体工厂

Spring源码介绍

抽象工厂

public interface BeanFactory {
	Object getBean(String name) throws BeansException;
	...
}

具体工厂

适配器模式

Spring中的根据通知的时候,将Advisor适配为MethodInterceptor

适配器介绍

角色
		目标接口:
		抽象适配器:
		具体适配器:
		抽象源接口:
		具体源接口:

适配器就是将源接口适配为目标接口

Spring中的源码介绍

抽象适配器:

public interface AdvisorAdapter {
	/**
	 * 适配方法,将Advisor适配为MethodInterceptor Advisor就是源接口:MethodInterceptor就是目标接口
	 */
	MethodInterceptor getInterceptor(Advisor advisor);
}

具体适配器:
【Spring】Spring中的设计模式,spring,spring,设计模式,java

class AfterReturningAdviceAdapter implements AdvisorAdapter, Serializable {

	@Override
	public boolean supportsAdvice(Advice advice) {
		return (advice instanceof AfterReturningAdvice);
	}

	
	@Override
	public MethodInterceptor getInterceptor(Advisor advisor) {
		AfterReturningAdvice advice = (AfterReturningAdvice) advisor.getAdvice();
		return new AfterReturningAdviceInterceptor(advice);
	}
}

具体源接口:
【Spring】Spring中的设计模式,spring,spring,设计模式,java

代理模式

cglib、gdk代理

模版方法

Spring中的refresh方法中的postProcessFactory、onRefresh等

观察者模式

Spring中的事件监听

角色:
抽象目标,
具体目标,
具体观察者,
抽象观察者

抽象目标里面会有一个数组,存放具体的观察者,并且会有一个添加删除观察者的方法,还有一个通知所有观察者的方法。

具体目标需要通知观察者的时候,遍历数组通知观察者

Spring中的事件监听做了一定的变动
有四个角色
广播器:其实就是我们的抽象目标,包含了添加删除,广播事件方法
监听器:监听广播器广播的事件
事件:
事件源:触发事件的人,将事件添加到广播器中

构造器模式

Spring中解析xml或者注解为BeanDefinition信息的时候会使用BeanDefinitionHandler类

该类里面包含了一个 BeanDefinition 字段,可以调佣BeanDefinitionHandler中的方法给该字段设值,最后可以调用方法获取BeanDefinition文章来源地址https://www.toymoban.com/news/detail-625202.html

到了这里,关于【Spring】Spring中的设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解锁Spring Boot中的设计模式—03.委派模式:探索【委派模式】的奥秘与应用实践!

    委派模式 是一种负责任务的调度和分配模式,类似于代理模式但更注重结果而非过程。它可以被视为一种特殊情况下的静态代理的全权代理,但并不属于GOF 23种设计模式之一,而是归类为行为型模式。 委派模式在Spring框架中广泛应用,其中最常见的例子是 DispatcherServlet ,它

    2024年02月19日
    浏览(57)
  • 解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!

    桥接模式也称为桥梁模式、接口模式或者柄体(Handle and Body)模式,是将 抽象部分 与他的 具体实现部分 分离 ,使它们都可以独立地变化,通过 组合 的方式 建立 两个类之间的 联系 ,而不是继承。 桥接模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们

    2024年02月21日
    浏览(56)
  • Java 设计者模式以及与Spring关系(四) 代理模式

    目录 简介: 23设计者模式以及重点模式 代理模式(Proxy Pattern) 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁,但不推荐) 2.基于CGLIB实现 spring中应用 本文是个系列一次会出两个设计者模式作用,如果有关联就三

    2024年01月23日
    浏览(49)
  • java Spring中使用到的设计模式

    单例模式(Singleton Pattern)是java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接

    2024年02月16日
    浏览(63)
  • 解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

    解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义语言的文法,并且解释语言中的表达式。在Java中,解释器模式可以用于构建解释器以解析特定的语言或表达式,如数学表达式、查询语言等。 优点: 灵活性: 解释器模式可以 灵活地添加新的表达式和规则 ,因

    2024年02月19日
    浏览(72)
  • Java 设计者模式以及与Spring关系(七) 命令和迭代器模式

    本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。 23设计者模式以及重点模式 我们都知道 设计者模式 有 3 类 23 种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。 (1)创建

    2024年01月24日
    浏览(37)
  • Java 设计者模式以及与Spring关系(六) 装饰和模版方法模式

    本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。 23设计者模式以及重点模式 我们都知道 设计者模式 有 3 类 23 种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。 (1)创建

    2024年01月24日
    浏览(42)
  • spring的设计模式----简单工厂模式

    spring中IoC 控制反转,底层是工厂模式。 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的

    2024年02月17日
    浏览(46)
  • Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)

    是一种设计原则,降低程序代码之间的耦合度 对象由Ioc容器统一管理,当程序需要使用对象时直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器 依赖注入是一种消除类之间依赖关系的设计模式。例如,A类要依赖B类,A类不再直接创建B类,而是把这种依赖

    2024年02月19日
    浏览(38)
  • Spring⾥⽤到的设计模式

    Spring 框架是一个广泛应用于企业级 Java 开发的开源框架,它提供了一系列的模块,包括依赖注入、面向切面编程、事务管理等功能,以简化企业级应用的开发。在 Spring 的设计和实现中,采用了多种设计模式来解决不同的问题,提高代码的可维护性、可扩展性和可重用性。

    2024年01月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包