Spring中用到的设计模式

适配器模式

  • 首先,将所有的适配器放到一个集合中,当要使用适配器的时候,遍历集合找出相对应的适配器,将该适配器返回给用户,用户执行适配器中的方法传入需要适配的类型,返回需要的类型

  • 每一个通知都对应一个拦截器,Spring需要将具体的通知封装成拦截器,返回给容器,这里对advice的转换就用到了适配器模式

  • 想一下,你定义的advice通知方法,最终是不是要通过拦截器去执行的

public interface AdvisorAdapter {
    // 判断通知类型是否匹配
    boolean supportsAdvice(Advice advice);
    // 获取对应的拦截器
    MethodInterceptor getInterceptor(Advisor advisor);
​
}
​
​
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
​
    @Override
    public boolean supportsAdvice(Advice advice) {
        return (advice instanceof MethodBeforeAdvice);
    }
​
    @Override
    public MethodInterceptor getInterceptor(Advisor advisor) {
        MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
        // 通知类型匹配对应的拦截器
        return new MethodBeforeAdviceInterceptor(advice);
    }
}
​
​
  • 在Spring MVC中,DispatcherServlet作为用户,HandlerAdapter作为期望接口,具体的适配器实现类用于对目标类进行适配,Controller作为需要适配的类

  • 当Spring容器启动后,会将所有定义好的适配器对象存放在一个List集合中,当一个请求来临时,DispatcherServlet会通过handler的类型找到对应适配器,并将该适配器对象返回给用户,然后就可以统一通过适配器的hanle()方法来调用Controller中的用于处理请求的方法。

 

public interface HandlerAdapter {  
​
    boolean supports(Object handler);
​
    ModelAndView handle(HttpServletRequest request, HttpServletResponse 
​
    response, Object handler) throws Exception;  
}

单例模式

  • spring的bean模式都是单例的 singleton

简单工厂

  • spring中的BeanFactory就是简单工厂模式的体现,传入一个唯一的标识来获取bean对象

工厂方法

  • 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。

  • 实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调 用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个 bean.getOjbect()方法的返回值。

动态代理

  • 切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象创建动态的创建一个代理 对象。SpringAOP就是以这种方式织入切面的。

织入:把切面应用到目标对象并创建新的代理对象的过程。

模板方法

  • spring启动流程有个onRefresh()方法是空方法,留给子类来重写,在springboot中来内嵌tomcat。

装饰器模式

  • Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有 Decorator。

观察者模式

  • spring的事件驱动模型使用的是 观察者模式,listener的实现

策略模式

  • 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else。

  • 比如我们生活中的场景:买东西结账可以使用微信支付、支付宝支付或者银行卡支付,这些交易方式就是不同的策略。

  • 在《阿里巴巴Java开发手册》中有提到当超过 3 层的 if-else 的逻辑判断代码可以使用策略模式来实现。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值