深入理解Spring之架构与组件

时间:2021-6-5 作者:qvyue

前言

最近发现很多程序员朋友包括我自己在内,工作几年后依然对Spring的理解只是 IOC 和 AOP,原因大家都知道(面试官爱问),然而实际上对 Spring 并没有深入的理解。

今天涉及知识点:

  1. Spring 解决了什么问题

  2. Spring 整体架构

  3. Spring 组件

  4. 简单WEB-SSM项目的Spring依赖

一. Spring 解决了什么问题

  • Spring 作为主流的 Java EE 解决方案,它最核心的作用应该是整合
  • Spring 框架主要优势是分层架构组件化设计,分层架构允许用户选择使用需要的组件,并通过 Java Beans 管理应用程序中的组件。
  • 支持声明式事务管理,通过RMI或Web服务远程访问逻辑代码,以及持久化数据的操作

二. Spring 整体架构

深入理解Spring之架构与组件
Spring4架构图

三. Spring 组件

组成 Spring 框架的每个模块都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

1. Core Container :
  • spring-core: 提供 Spring 框架的基本功能,包括 IOC 和 DI 功能。
  • spring-beans:核心容器的主要组件是 BeanFactory,它是工厂模式的经典实现,Spring 将管理对象称为 Bean。BeanFactory 通过 IOC 将应用程序的依赖配置与实际的应用程序代码分离。
  • spring-context:是一个配置文件,向 Spring框架提供上下文信息。建立在Core和 Beans 模块的基础上,它是访问和配置任何对象的媒介,通过类似于JNDI注册表(注册名与对象的映射)的方式访问对象。

ApplicationContext接口是上下文模块的焦点。通过分析它继承的接口,看看它实现了哪些功能

public interface ApplicationContext extends 
EnvironmentCapable,  //获取Environment实例,即具备读取环境信息功能
ListableBeanFactory,   //获取容器中 Bean 信息
HierarchicalBeanFactory,  //父子级联IOC容器的接口,子容器可以通过接口方法访问父容器的bean
MessageSource,   //国际化接口
ApplicationEventPublisher,   //事件发布接口
ResourcePatternResolver  //资源解析
 {
    @Nullable
    String getId();

    String getApplicationName();

    String getDisplayName();

    long getStartupDate();

    @Nullable
    ApplicationContext getParent();

    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

spring-context-support提供将通用第三方库集成到 Spring-context 的支持,包括缓存(EhCache,Guava,JCache),邮件(JavaMail),调度(CommonJ,Quartz)和模板引擎(FreeMarker,JasperReports,Velocity),如下图:

深入理解Spring之架构与组件
  • spring-expression: 是运行时查询和操作对象图的强大的表达式语言
2. AOP and Instrumentation :
  • spring-aop:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
  • spring-aspects:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
  • spring-instrument:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。如spring-instrument-tomcat 模块包含Spring的Tomcat的检测代理。
3. Messaging :
  • spring-messaging:为集成messaging api和消息协议提供支持,其中base定义了消息Message(MessageHeader和body)、消息处理MessageHandler、发送消息MessageChannel。该模块还包括一组注释,用于将消息映射到方法,类似于基于Spring MVC注释的编程模型。
4. Data Access/Integration :
  • spring-jdbc:提供了JDBC抽象层,无需进行繁琐的JDBC编码和数据库供应商特定错误代码的解析。

  • spring-tx:支持对实现特殊接口的类以及所有POJO进行编程和声明式事务管理。

  • spring-orm:为流行的 object-relational mapping API(包括JPAJDOHibernate提供了集成层 。使用该spring-orm模块,可以将所有这些 Object/XML mapping 框架与Spring提供的所有其他功能结合使用,例如前面提到的简单的声明式事务管理功能。

  • spring-oxm:提供了一个抽象层,该抽象层支持Object/XML mapping 实现,例如JAXB,Castor,XMLBeans,JiBX和XStream。

  • spring-jmsJava Messaging Service包含用于生成和使用消息的功能。从Spring Framework 4.1开始,它提供了与spring-messaging模块的集成 。

5. WEB :
  • spring-web:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及 Web 应用上下文。

  • spring-webmvc:也称 Web-Servlet ,包含Spring的model-view-controller(MVC)和针对Web应用程序的REST Web Services实现。Spring的MVC框架在域模型代码和Web表单之间提供了清晰的分隔,并与Spring框架的所有其他功能集成在一起。

  • spring-webmvc-portlet:也称Web-Portlet,提供要在Portlet环境中使用的MVC实现。

6. Test :
  • spring-test模块支持Spring组件与JUnit或TestNG的单元测试集成测试。它提供了Spring 的一致加载ApplicationContext和这些上下文的缓存。它还提供了可用于单独测试代码的模拟对象。

四. WEB-SSM项目的Spring依赖

依赖关系图如下:

深入理解Spring之架构与组件
基于spring5

pom依赖:

    885.2.12.RELEASE3.4.6org.springframeworkspring-webmvc${spring.version}org.springframeworkspring-jdbc${spring.version}org.mybatismybatis-spring1.3.2org.mybatismybatis${mybatis.version}mysqlmysql-connector-java5.1.45com.alibabadruid1.0.20org.springframeworkspring-core${spring.version}org.springframeworkspring-beans${spring.version}org.springframeworkspring-context${spring.version}org.springframeworkspring-jdbc${spring.version}org.springframeworkspring-tx${spring.version}org.springframeworkspring-web${spring.version}org.springframeworkspring-webmvc${spring.version}org.springframeworkspring-test${spring.version}org.mybatismybatis-spring1.3.2org.mybatismybatis${mybatis.version}mysqlmysql-connector-java5.1.45com.alibabadruid1.0.20jstljstl1.2com.fasterxml.jackson.corejackson-databind2.9.5javax.servletjavax.servlet-api3.1.0

ok,今天的内容就分享到这里了,欢迎留言指正,谢谢大家!
————————– 期待您的点赞三连 ————————
————————– 期待您的点赞三连 ————————
————————– 期待您的点赞三连 ————————

参考资料

  1. Spring框架参考文档
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。