spring学到什么程度,学校会教spring吗

  spring学到什么程度,学校会教spring吗

  最近看了一些Spring源代码,发现关于源代码分析的文章很多,关于底层思想分析的文章很少。这一系列文章将总结Spring给我们的启示,包括设计模式思想、坚实的设计原则等。涉及一些基本的编程原理。虽然看似简单,其实是“一点道理,一所大学问”。

  我试着说说我遇到过的问题,说说解决方法,至少举两个例子。

  这些方法都是基于我遇到的一些实际代码。如果我掌握了基本思想,我就能举一反三。

  晕跳如果你经过一些培训机构的源代码课程,你会发现他们的老师在讲源代码的时候不断的在类和方法之间跳来跳去,学生一脸懵逼。因为如果不理解老师讲课的思路,或者稍微走神,就会觉得跟不上。

  其实问题在于需要了解源代码的基本流程和继承链的单一责任原则。

  理解继承链的面向对象特性是封装继承和多态,封装体现在私有方法中。

  在Spring中,常见的模式是顶层是接口,然后是抽象类,最后是实现类。

  接口负责对外公开,这符合面向接口编程的标准。当实现类改变时,可以减少对代码的改变,以确保代码依赖于抽象(接口)。

  抽象类一般用模板模式组装逻辑,从子类中提取常用逻辑,方便子类编写。一般模板都是固定的执行链,我们看源代码的时候可以注意一下。比如常见的abstractapplicationcontext:refresh方法和AbstractBeanFactory:doGetBean方法。因为接口只能公开方法声明,抽象类可以实现一些状态的getter和setter,所以子类只需要调用方法就可以访问这些状态数据。

  通常有多个实现,比如todo。有时,当只有一个实现类或默认实现类时,通常使用默认名称,如DefaultListableBeanFactory。在读取源代码时,可以选择读取默认实现。

  Java只支持单一继承。这种语言规范方便我们阅读源代码,一个方法的实现必须在一个继承链中。

  示例1:

  Spring BeanFactory的默认实现是DefaultListableBeanFactory。从继承图中可以看出,有几个抽象类,它们从上到下分别实现了以下功能:

  SimpleAliasRegistry注册表

  DefaultSingletonBeanRegistry

  FactoryBeanRegistrySupport

  AbstractBeanFactory

  抽象TautowireCapableBeanfactory同时我们也可以看到,基本上每个抽象类都对应一个实现的接口:

  alias registrysimple alias registry

  singletonbean registrydefaultsingletonbean registry

  AbstractBeanFactory 可配置BeanFactory

  摘要AutowireCapableBeanFactoryAutowireCapableBeanFactory

  请注意,DefaultListableBeanFactory实现了可配置的ListableBeanFactory。这个接口实现了一些简化Beanfactory配置的方法,是一个通用的基础设施类(接口)。

  其实这个设计也是不得已而为之。Java只支持单一继承。理想情况下,DefaultListableBeanFactory需要继承不同的trait,即单实例注册、FactoryBean注册等功能模块。可配置、可列表、可* *正是这种设计思想的体现。如果把最终的DefaultListableBeanFactory写成一个类的话,会很庞大,但是如果把BeanFactory的不同特性拆分开来,就会得到一个看似复杂的接口继承关系,如图所示。

  这种松散的接口继承关系正是我们所需要的。例如,autowireCapable和hierarchical之间没有实际的联系。一个侧重于属性注入,一个侧重于bean工厂的层次关系(可以有父工厂)。

  假设每个松散接口都有几个或者更多的实现,不管是抽象类还是具体实现,我们只能通过多重继承或者委托模式组装得到DefaultListableBeanFactory。

  这就是矛盾,继承链单一,接口松散。因此,抽象类有一些不必要的功能。例如AbstractTautowireCapableBeanfactory具有可配置、aliasRegistry等功能。这种情况是我们在阅读源代码时要注意的。

  Spring通过将单一继承链拆分为六个类来拆分DefaultListableBeanFactory的功能,符合开放封闭原则,每个类也符合单一责任原则的要求。

  通过以上分析,打开DefaultListableBeanFactory的源代码。虽然有2000多行,但是我们可以清楚的看到类的结构,包括1\继承链相关:不同抽象方法的实现和抽象类中没有实现的接口方法的实现。2.BeanDefinitionRegistry 3。ConfigurableListableBeanFactory 4。可序列化

  示例2:

  与上面的分析类似,AnnotationConfigApplicationContext的继承链如下:

  DefaultResourceLoaderAbstractApplicationContextGenericApplicationContextAnnotationConfigApplicationContext

  每个类实现的功能都是它直接实现的接口,有些类通过它的类名就能很快知道实现的功能。没有更多的细节。

  GenericApplicationContext实现BeanDefinitionRegistry,直接将BeanFactory的实现委托给DefaultListableBeanFactory。其子类包括AnnotationConfigApplicationContext和mvc容器。

  您可以在抽象类AbstractApplicationContext中看到熟悉的刷新方法。

  ApplicationContext是重量级的。作为应用程序容器,它具有事件广播、国际化、资源读取等能力。豆制品厂外面。

  因为ApplicatoinContext是一个大接口,是不同功能的最终集成,所以我们看到的接口继承关系并不复杂。

  示例3:

  我们知道MVC模型中有一个中央调度器,在SpringMvc中体现为DispatcherServlet,其继承链如图所示。

  了解过servlet的人都知道HTTP servlets有doGet、doPost等方法。子类化之后,所有方法都被转发给DispatcherServlet。doServicedoDispatch实现了众所周知的分发模板逻辑:简而言之,它是

  getHandlergetHandlerAdapterapplyPreHandle* * handle * *applyPostHandleprocessDispatchResult

  ProcessDispatchResult包含异常处理、render和afterCompletion。

  我们选择任何方法,比如初始化mvc容器,都必须在继承链中的一个类中实现。通过分析源代码,我们可以看到:

  webapplicationcontext是在FrameworkServlet中实现的。

  GenericServlet公开init方法。

  HttpServletBean实现init方法,并在init方法中公开initServletBean方法。

  FrameworkServlet实现initServletBean方法,其中实现了initWebApplicationContext方法。

  虽然初始化mvc容器的方法需要在继承链中来回跳转,但是它实现了单一责任的原则,每个类负责实现一个特定的功能,模板类实现模板进程,实现类实现具体的实现。

  版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: