0%

spring结构

Spring 框架核心构成与模块解析:从核心容器到企业级集成

Spring 框架是 Java 企业级开发的 “基石”,其设计理念是 “模块化、松耦合、可扩展”,通过分层的模块架构覆盖从 “核心 IOC 容器” 到 “Web 开发”“数据访问”“AOP 切面” 等全场景需求。从 “核心容器→数据访问→Web 开发→AOP 与扩展” 四大维度,详细拆解每个模块的职责、核心组件及实际应用场景,并梳理模块间的协作关系。

Spring 框架整体架构图

模块

核心容器层(Core Container):Spring 的 “地基”

核心容器是 Spring 框架的基础核心,提供 IOC(控制反转)DI(依赖注入) 核心能力,所有其他模块均依赖于此层。其核心目标是 “管理对象的生命周期与依赖关系”,降低代码耦合度。

1. Spring Core:核心工具类与 IOC 基础

  • 核心职责:提供 Spring 框架的底层核心工具类,是 IOC 容器的 “骨架”。
  • 核心组件:
    • BeanFactory:IOC 容器的顶层接口,采用工厂模式管理 Bean,负责 Bean 的创建、依赖注入与生命周期控制。
      • 特点:延迟初始化(容器实例化时不创建 Bean,仅在调用 getBean() 时才实例化并装配依赖),适合内存敏感场景。
      • 常用实现:DefaultListableBeanFactory(Spring 内部默认实现,支持 XML / 注解配置)。
    • BeanDefinition:描述 Bean 的 “元数据”(如类名、属性、依赖、作用域等),是容器创建 Bean 的依据。
  • 关键作用:定义 IOC 容器的基本规范,为其他模块提供基础支持(如 Bean 注册、依赖解析)。

2. Spring Beans:Bean 管理核心

  • 核心职责:封装 Bean 的创建、配置、装配逻辑,是 IOC 容器的 “具体实现者”。
  • 核心组件:
    • BeanFactory 扩展类:如 XmlBeanFactory(已过时,推荐 DefaultListableBeanFactory)、AnnotationConfigApplicationContext(注解配置容器)。
    • Bean 生命周期接口:如 InitializingBean(Bean 初始化后回调)、DisposableBean(Bean 销毁前回调),支持自定义 Bean 生命周期逻辑。
    • 依赖注入工具:如 AutowiredAnnotationBeanPostProcessor(处理 @Autowired 注解)、CommonAnnotationBeanPostProcessor(处理 @Resource 注解)。
  • 关键作用:将 “对象创建” 与 “业务逻辑” 解耦,开发者无需手动 new 对象,由容器统一管理。

3. Spring Context:上下文与企业级特性

  • 核心职责:在 Core 和 Beans 基础上,扩展 IOC 容器的能力,提供企业级特性(如国际化、事件传播、资源加载),是 “增强版 BeanFactory”。

  • 核心组件:

    • ApplicationContext:Context 模块的顶层接口,继承BeanFactory,提供更丰富的功能:
      • 特点:立即初始化(容器实例化时,自动实例化所有 “单例 Bean” 并装配依赖),适合大多数企业级场景。
      • 常用实现:
        • ClassPathXmlApplicationContext(从类路径加载 XML 配置);
        • FileSystemXmlApplicationContext(从文件系统加载 XML 配置);
        • AnnotationConfigApplicationContext(从注解类加载配置,如 @Configuration)。
    • 国际化支持MessageSource 接口,支持多语言配置(如 messages_zh_CN.propertiesmessages_en_US.properties)。
    • 事件机制ApplicationEvent(事件)与 ApplicationListener(监听器),支持组件间解耦通信(如 “用户注册成功后发送通知”)。
    • 资源加载Resource 接口,统一处理类路径、文件系统、URL 等资源(如 ClassPathResourceFileSystemResource)。
  • 关键区别(与 BeanFactory):

    | 特性 | BeanFactory | ApplicationContext(Context) |
    | ————— | —————————————— | ——————————————————- |
    | 初始化策略 | 延迟初始化(getBean 时创建) | 立即初始化(容器启动时创建单例 Bean) |
    | 功能范围 | 基础 Bean 管理 | 基础管理 + 国际化 / 事件 / 资源加载等 |
    | 适用场景 | 内存敏感场景(如移动端) | 企业级应用(绝大多数场景) |

4. Spring EL(Expression Language):表达式语言

  • 核心职责:提供强大的表达式语言,支持在配置文件或注解中动态访问 / 操作对象属性、方法、数组等,简化配置。
  • 核心能力:
    • 访问 Bean 属性:#{user.name}(获取 user Bean 的 name 属性);
    • 调用方法:#{user.getAge() + 1}(调用 usergetAge() 并加 1);
    • 操作集合:#{users[0].name}(获取 users 集合第一个元素的 name);
    • 调用静态方法:#{T(java.lang.Math).random()}(生成随机数)。
  • 应用场景:
    • XML 配置:<property name="age" value="#{user.age + 5}"/>
    • 注解配置:@Value("#{systemProperties['user.dir']}")(注入系统属性)。

数据访问 / 集成层(Data Access/Integration):简化数据交互

数据访问层是 Spring 对 “数据库操作、消息队列、对象映射” 等数据交互场景的封装,核心目标是简化数据访问代码,统一异常处理,支持事务管理

1. Spring JDBC:JDBC 抽象层

  • 核心职责:封装原生 JDBC 的冗余代码(如连接创建、Statement 管理、异常处理),提供简洁的 JDBC 操作 API。

  • 核心组件:

    • JdbcTemplate:核心工具类,封装了 JDBC 的增删改查逻辑,开发者只需关注 SQL 与参数:

      1
      2
      3
      4
      5
      6
      7
      // 示例:查询用户
      JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
      User user = jdbcTemplate.queryForObject(
      "SELECT id, name FROM user WHERE id = ?",
      new Object[]{1L},
      (rs, rowNum) -> new User(rs.getLong("id"), rs.getString("name"))
      );
    • NamedParameterJdbcTemplate:支持命名参数(如:id),避免参数索引错误:

      1
      2
      3
      String sql = "SELECT id, name FROM user WHERE id = :id";
      Map<String, Object> params = Map.of("id", 1L);
      User user = namedJdbcTemplate.queryForObject(sql, params, rowMapper);
    • SQLExceptionTranslator:统一 JDBC 异常(如 SQLSyntaxErrorException)为 Spring 自定义异常(如 DataAccessException),简化异常处理。

  • 关键优势:无需手动关闭连接 / Statement,自动处理异常,代码量减少 50% 以上。

2. Spring ORM:对象关系映射集成

  • 核心职责:整合主流 ORM 框架(如 Hibernate、MyBatis、JPA),提供统一的编程模型与事务管理支持,避免 ORM 框架与业务代码强耦合。

  • 支持的 ORM 框架:

    • Hibernate:通过 HibernateTemplate 封装 Hibernate 操作,统一异常与事务;
    • MyBatis:通过 SqlSessionTemplate 整合 MyBatis,支持 Spring 事务管理;
    • JPA:通过 JpaTemplateEntityManagerFactory 整合 JPA,支持注解式查询(如 @Query)。
  • 应用场景:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Spring 整合 MyBatis 示例
    @Service
    public class UserService {
    @Autowired
    private UserMapper userMapper; // MyBatis Mapper 接口

    @Transactional // Spring 事务注解(统一事务管理)
    public User getUserById(Long id) {
    return userMapper.selectById(id);
    }
    }

3. Spring OXM:对象 - XML 映射

  • 核心职责:提供对象与 XML 之间的映射抽象层,支持主流 OXM 框架(如 JAXB、XStream、Castor),统一 XML 序列化 / 反序列化 API。

  • 核心组件:

    • Marshaller:将 Java 对象序列化为 XML;
    • Unmarshaller:将 XML 反序列化为 Java 对象。
  • 应用场景:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // JAXB 实现 OXM 示例
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setClassesToBeBound(User.class); // 绑定需要映射的类

    // 对象转 XML
    User user = new User(1L, "张三");
    StringWriter writer = new StringWriter();
    marshaller.marshal(user, new StreamResult(writer));
    String xml = writer.toString(); // <user><id>1</id><name>张三</name></user>

    // XML 转对象
    User userFromXml = (User) marshaller.unmarshal(new StreamSource(new StringReader(xml)));

4. Spring JMS:消息服务集成

  • 核心职责:封装 Java Message Service(JMS)API,支持主流消息中间件(如 ActiveMQ、RabbitMQ),简化消息的生产与消费。

  • 核心组件:

    • JmsTemplate:核心工具类,封装 JMS 连接创建、会话管理、消息发送 / 接收逻辑;
    • MessageListenerContainer:消息监听容器,支持异步接收消息(如 DefaultMessageListenerContainer)。
  • 应用场景:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 发送消息
    @Autowired
    private JmsTemplate jmsTemplate;

    public void sendMessage(String queueName, String message) {
    jmsTemplate.convertAndSend(queueName, message);
    }

    // 接收消息
    @Component
    public class MessageListener {
    @JmsListener(destination = "user.queue") // 监听指定队列
    public void onMessage(String message) {
    System.out.println("收到消息:" + message);
    }
    }

5. Spring Transaction:事务管理

  • 核心职责:提供声明式事务编程式事务支持,统一事务管理逻辑,支持多种事务管理器(如 JDBC 事务、ORM 事务、JMS 事务)。

  • 核心特性:

    • 声明式事务:通过@Transactional注解或 XML 配置,无需手动编写事务代码(推荐):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      @Service
      public class OrderService {
      @Autowired
      private OrderMapper orderMapper;

      // 声明式事务:方法执行异常时自动回滚
      @Transactional(rollbackFor = Exception.class)
      public void createOrder(Order order) {
      orderMapper.insert(order);
      // 其他业务逻辑(如扣减库存)
      }
      }
    • 编程式事务:通过TransactionTemplate手动控制事务(灵活但代码冗余):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      @Autowired
      private TransactionTemplate transactionTemplate;

      public void createOrder(Order order) {
      transactionTemplate.execute(status -> {
      try {
      orderMapper.insert(order);
      return true;
      } catch (Exception e) {
      status.setRollbackOnly(); // 手动回滚
      return false;
      }
      });
      }
  • 关键优势:与数据访问层无缝集成,支持跨数据源事务(分布式事务需配合 Spring Cloud Alibaba Seata 等组件)。

Web 层:Web 应用开发支持

Web 层是 Spring 对 Web 应用开发的支持,核心是 Spring MVC,提供 “请求处理、视图渲染、参数绑定” 等全流程 Web 开发能力,是 Java Web 开发的主流框架之一。

1. Spring Web:基础 Web 集成

  • 核心职责:提供 Web 应用的基础集成能力,如 Web 上下文、请求拦截、Servlet 适配等,是 Web-Servlet(Spring MVC)的基础。
  • 核心组件:
    • WebApplicationContext:Web 环境下的 Spring 上下文,继承 ApplicationContext,添加 Web 相关特性(如获取 ServletContext);
    • DispatcherServlet:Spring MVC 的核心 Servlet(前端控制器),负责接收所有请求并分发(后续 Web-Servlet 模块详解);
    • HandlerInterceptor:请求拦截器,支持在请求处理前 / 后、视图渲染后执行自定义逻辑(如登录验证、日志记录)。

2. Spring Web-Servlet(Spring MVC):MVC 框架

  • 核心职责:实现 MVC(Model-View-Controller)设计模式,是 Spring Web 层的核心,负责 Web 请求的接收、处理与响应。

  • 核心流程(请求处理):

    1. 客户端发送请求,由 DispatcherServlet(前端控制器)接收;
    2. DispatcherServlet 调用 HandlerMapping(处理器映射),根据请求 URL 找到对应的 Controller(处理器);
    3. DispatcherServlet 调用 HandlerAdapter(处理器适配器),执行 Controller 的业务逻辑,返回 ModelAndView(模型 + 视图);
    4. DispatcherServlet 调用 ViewResolver(视图解析器),将 ModelAndView 解析为具体视图(如 JSP、Thymeleaf);
    5. 视图渲染模型数据,返回响应给客户端。
  • 核心组件:

    • @Controller:标记类为控制器,处理 HTTP 请求;
    • @RequestMapping:映射请求 URL 到方法(如 @GetMapping("/user/{id}"));
    • @RequestParam/@PathVariable:绑定请求参数到方法参数;
    • ViewResolver:视图解析器(如 InternalResourceViewResolver 解析 JSP,ThymeleafViewResolver 解析 Thymeleaf)。
  • 应用场景:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // Spring MVC Controller 示例
    @Controller
    @RequestMapping("/user")
    public class UserController {
    @Autowired
    private UserService userService;

    // 处理 GET 请求:/user/1
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id, Model model) {
    User user = userService.getUserById(id);
    model.addAttribute("user", user); // 模型数据
    return "userDetail"; // 视图名(由 ViewResolver 解析为 userDetail.jsp)
    }
    }

3. Spring Web-Struts(已弃用)

  • 核心职责:早期用于整合 Apache Struts 框架(另一个 MVC 框架),实现 Spring 容器与 Struts 控制器的协作。
  • 现状:Spring 3.0 后正式弃用,原因是 Spring MVC 功能更完善、集成更简单,且 Struts 框架逐渐被 Spring MVC 取代。

4. Spring Web-Portlet:Portlet 环境支持

  • 核心职责:为 Portlet 环境(如门户网站的模块化组件)提供 MVC 实现,适配 Portlet 的请求生命周期(如 ACTION_PHASERENDER_PHASE)。
  • 应用场景:仅用于传统 Portlet 开发(如 Liferay 门户),目前主流 Web 应用已很少使用。

AOP 与扩展层:增强代码能力与框架集成

AOP(面向切面编程)是 Spring 框架的另一大核心特性,通过 “横切关注点”(如日志、事务、权限)的模块化,实现代码的 “关注点分离”,减少重复代码。

1. Spring AOP:面向切面编程核心

  • 核心职责:提供符合 AOP 规范的切面编程实现,支持在不修改原有代码的情况下,为方法添加增强逻辑(如前置通知、后置通知、异常通知)。

  • 核心概念:

    • 切面(Aspect):封装横切关注点的类(如 LogAspect);
    • 连接点(JoinPoint):可能被增强的方法(如所有 Service 层的方法);
    • 切入点(Pointcut):定义哪些连接点需要被增强(如 execution(* com.example.service.*.*(..)));
    • 通知(Advice):切面的具体增强逻辑(如 @Before 前置通知、@AfterReturning 后置通知)。
  • 实现方式:

    • 基于注解(推荐):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      // 切面类
      @Aspect
      @Component
      public class LogAspect {
      // 切入点:匹配所有 Service 层方法
      @Pointcut("execution(* com.example.service.*.*(..))")
      public void servicePointcut() {}

      // 前置通知:方法执行前记录日志
      @Before("servicePointcut()")
      public void beforeAdvice(JoinPoint joinPoint) {
      String methodName = joinPoint.getSignature().getName();
      System.out.println("方法 " + methodName + " 开始执行");
      }
      }
    • 基于 XML 配置:早期方式,现已被注解取代。

  • 关键优势:横切逻辑与业务逻辑解耦(如日志、事务无需嵌入业务代码),便于维护与扩展。

2. Spring Aspects:AspectJ 集成

  • 核心职责:整合 AspectJ 框架(最成熟的 AOP 框架),扩展 Spring AOP 的功能(如支持更多切入点表达式、类型间通知等)。
  • 核心特性:
    • 支持 AspectJ 注解(如 @Aspect@Pointcut),Spring AOP 原生已支持部分 AspectJ 语法;
    • 提供 AspectJWeavingEnabler,支持编译期织入(Compile-Time Weaving)与加载期织入(Load-Time Weaving)。
  • 应用场景:需要复杂 AOP 逻辑时(如类初始化增强、静态方法增强),Spring AOP 原生能力不足,可借助 AspectJ。

3. Spring Instrumentation:类加载增强

  • 核心职责:提供类加载器(ClassLoader)增强与类字节码修改能力,支持在 JVM 加载类时动态修改类定义(如 AOP 的加载期织入)。
  • 核心组件:
    • Instrumentation:JVM 提供的工具接口,Spring 封装为 SpringInstrumentor
    • LoadTimeWeaver:加载期织入器,支持在类加载时织入 AOP 切面(如 TomcatLoadTimeWeaver 适配 Tomcat 容器)。
  • 应用场景:主要用于 AOP 加载期织入(无需编译期修改字节码),或自定义类加载逻辑(如热部署、类加密解密)。

模块间协作关系:Spring 如何 “串联” 所有功能

Spring 各模块并非独立存在,而是通过 “核心容器” 为纽带,形成有机整体。以 “Web 应用查询用户” 为例,梳理模块协作流程:

  1. Web 层(Spring MVC)DispatcherServlet 接收 /user/1 请求,通过 HandlerMapping 找到 UserControllergetUser 方法;
  2. AOP 层@Transactional 注解触发 Spring AOP,创建事务代理,为 UserServicegetUserById 方法添加事务增强;
  3. 业务层(依赖核心容器)UserController 依赖 UserService(由 ApplicationContext 注入,IOC 容器管理);
  4. 数据访问层(Spring MyBatis 集成)UserService 调用 UserMapper(MyBatis Mapper 接口,由 Spring 管理),SqlSessionTemplate 执行 SQL;
  5. 事务管理(Spring Transaction):若 SQL 执行成功,事务自动提交;若异常,自动回滚;
  6. 核心容器:全程由 ApplicationContext 管理 Bean 的创建、依赖注入与生命周期(如 UserControllerUserServiceUserMapper 均为容器中的 Bean)。

总结:Spring 框架的核心价值

Spring 框架通过模块化设计,实现了 “一站式” 企业级开发支持,其核心价值体现在:

  1. 解耦:IOC/DI 降低对象依赖耦合,AOP 降低横切逻辑与业务逻辑耦合;
  2. 简化开发:封装 JDBC、MVC、事务等冗余代码,开发者专注业务逻辑;
  3. 可扩展:模块化架构支持按需引入模块(如仅用核心容器 + JDBC,或全量引入 Web+AOP+ORM);
  4. 生态丰富:与 MyBatis、Hibernate、RabbitMQ、Spring Boot、Spring Cloud 等无缝集成,形成庞大生态

欢迎关注我的其它发布渠道