视频公司的网站设计,网站建设先进个人,找客户的十大方法,html网页设计怎么写代码目录
Spring 框架核心设计模式深度解析
一、单例模式 (Singleton Pattern)
1. 基础形态#xff1a;饿汉式 vs 懒汉式
2. 进阶形态#xff1a;双重检查锁定 (DCL) 与 静态内部类
3. Spring 中的终极落地
3.1 核心实现#xff1a;单例注册表
3.2 获取单例的逻辑 (getSi…目录Spring 框架核心设计模式深度解析一、单例模式 (Singleton Pattern)1. 基础形态饿汉式 vs 懒汉式2. 进阶形态双重检查锁定 (DCL) 与 静态内部类3. Spring 中的终极落地3.1 核心实现单例注册表3.2 获取单例的逻辑 (getSingleton)3.3 线程安全与并发二、工厂模式 (Factory Pattern)1. 基础形态简单工厂 (Simple Factory)2. 进阶形态工厂方法模式 (Factory Method)3. Spring 中的终极落地3.1 容器级工厂BeanFactory3.2 用户级工厂FactoryBean 接口重点三、代理模式 (Proxy Pattern)1. 基础形态静态代理 (Static Proxy)2. 进阶形态JDK 动态代理 (JDK Dynamic Proxy)3. 进阶形态CGLIB 动态代理4. Spring 中的 AOP 源码实现四、适配器模式 (Adapter Pattern)1. 基础形态对象适配器2. Spring 中的宏大叙事HandlerAdapter五、策略模式 (Strategy Pattern)1. 基础实现2. Spring 中的资源加载 (Resource)3. Spring 中的 Bean 实例化 (InstantiationStrategy)六、模板模式 (Template Method Pattern)1. 经典继承式模板2. Spring 的变体模板 回调 (Template Callback)七、观察者模式 (Observer Pattern)1. 基础实现2. Spring 的事件驱动模型 (Event-Driven)八、深度总结设计模式背后的核心思想1. 资源复用与全局受控 (单例模式)2. 创建与使用的彻底分离 (工厂模式)3. 非侵入式的逻辑增强 (代理模式)4. 求同存异的兼容艺术 (适配器模式)5. 把选择权交给运行时 (策略模式)6. 流程标准化与细节定制化 (模板模式)7. 组件间的极致松耦合 (观察者模式)九、总结对照表Spring 框架核心设计模式深度解析本文档旨在对 Spring 框架中最核心的七大设计模式进行深度剖析。我们将遵循“原理 - 基础实现 - 进阶变体 - Spring 源码落地”的逻辑路径不仅解释“它是怎么做的”更要探讨“为什么这么做”全面揭示 Spring 强大扩展性背后的代码哲学。一、单例模式 (Singleton Pattern)单例模式是 Spring 框架中最基础、应用最广泛的模式。它的核心思想是保证一个类在整个系统中只有一个实例并提供一个全局访问点。1. 基础形态饿汉式 vs 懒汉式单例模式的实现核心在于“实例创建的时机”。饿汉式 (Eager Initialization)类加载时立即创建。优点线程天生安全由 JVM 保证执行效率高无锁。缺点无论是否使用实例都会占用内存可能造成资源浪费。懒汉式 (Lazy Initialization)第一次使用时才创建。优点资源利用率高。缺点必须处理多线程并发安全问题。2. 进阶形态双重检查锁定 (DCL) 与 静态内部类在生产环境中我们通常追求既延迟加载又线程安全的实现。双重检查锁定 (Double-Checked Locking)这是懒汉式的主流优化方案。public class Singleton { // volatile 禁止指令重排序防止读取到半初始化对象 private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { // 第一重检查避免不必要的加锁 synchronized (Singleton.class) { if (instance null) { // 第二重检查确保并发安全 instance new Singleton(); } } } return instance; } }静态内部类 (Static Inner Class)这是一种更优雅的 Java 写法利用了 JVM 类加载机制来实现延迟加载和线程安全无需使用 synchronized。public class Singleton { private Singleton() {} // 只有当 getInstance 被调用时Holder 才会加载INSTANCE 才会初始化 private static class Holder { private static final Singleton INSTANCE new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; } }3. Spring 中的终极落地Spring 中的单例模式与 GoF 原生模式有一个本质区别Spring 的单例是“容器级”的而非“ClassLoader 级”的。也就是说一个 Spring 容器中某个 Bean 默认只有一个实例。3.1 核心实现单例注册表Spring 并没有把 Bean 写成单例类而是通过一个注册表Registry来管理这些对象。这个注册表本质上就是一个巨大的缓存池。源码核心类DefaultSingletonBeanRegistry核心数据结构// 一级缓存存放已经完全初始化好的单例 Bean private final MapString, Object singletonObjects new ConcurrentHashMap(256); // 三级缓存机制用于解决循环依赖 // singletonFactories (三级): 存放 Bean 工厂用于提前暴露对象 // earlySingletonObjects (二级): 存放半成品对象3.2 获取单例的逻辑 (getSingleton)当调用getBean时Spring 会尝试从缓存中获取先去singletonObjects一级缓存拿。拿不到且当前 Bean 正在创建中循环依赖场景去earlySingletonObjects二级缓存拿。还拿不到去singletonFactories三级缓存拿并将其提升到二级缓存。如果都拿不到才开始真正的创建流程CreateBean并在创建完成后放入一级缓存。3.3 线程安全与并发Spring 容器在启动时refresh方法默认会使用主线程将所有非懒加载的单例 Bean 全部初始化Pre-instantiation。这意味着在应用真正对外提供服务前Bean 已经创建好了因此在运行时获取 Bean 是线程安全的直接从 Map 读。注意虽然获取 Bean 是安全的但Bean 自身的状态成员变量如果可变依然需要开发者自己保证线程安全。这也是为什么 Spring 建议 Bean 尽量设计为无状态的Stateless。二、工厂模式 (Factory Pattern)工厂模式是 Spring IoC控制反转容器的基石也是将代码从“面向实现”转向“面向接口”的关键一步。它的核心思想是将“对象的创建过程”与“对象的使用过程”彻底分离从而降低系统的耦合度。1. 基础形态简单工厂 (Simple Factory)这也是最直观的工厂写法虽然不属于 GoF 23 种设计模式但在小型项目或工具类中应用极广。实现方式定义一个静态方法根据传入的参数如字符串名称或枚举利用switch-case或if-else分支决定创建哪个具体的子类对象。代码示例public class SimpleFactory { // 静态方法由外部直接调用 public static Product createProduct(String type) { if (A.equals(type)) { // 这里可能包含 ProductA 复杂的初始化逻辑 return new ProductA(); } else if (B.equals(type)) { return new ProductB(); } // 如果类型无法识别通常抛出异常或返回 null throw new IllegalArgumentException(Unknown product type: type); } }缺点分析这种写法最大的问题是违背了设计模式中的“开闭原则”Open/Closed Principle。每当业务扩展需要新增一种ProductC时你都不得不修改SimpleFactory的源代码增加一个新的 case 分支。在大型系统中这种频繁的源码修改是导致 bug 滋生的温床。2. 进阶形态工厂方法模式 (Factory Method)这是 GoF 标准模式。它通过多态性解决了简单工厂的扩展性问题将“实例化”的责任推迟到了具体的子类工厂中进行。核心逻辑定义一个创建对象的抽象接口但由子类决定要实例化的类是哪一个。客户端只依赖于抽象工厂而不关心具体是哪个工厂在工作。代码示例// 抽象工厂接口 public interface Factory { Product create(); } // 具体工厂A专门负责生产 ProductA public class FactoryA implements Factory { Override public Product create() { return new ProductA(); } } // 具体工厂B专门负责生产 ProductB public class FactoryB implements Factory { Override public Product create() { // 假如 ProductB 的创建需要依赖数据库连接或配置文件 // 这些复杂的初始化逻辑都可以封装在这里而不污染客户端代码 return new ProductB(); } }3. Spring 中的终极落地Spring 将工厂模式运用到了极致主要体现在两个层面一个是宏观的容器管理一个是微观的特殊 Bean 创建。3.1 容器级工厂BeanFactorySpring 的BeanFactory接口是典型的工厂模式体现它是 Spring IoC 容器的顶层接口。机制当你调用getBean(userService)时Spring 容器就是一个巨大的工厂。它不仅仅是new一个对象那么简单它根据 BeanDefinition配方生产出 Bean 实例并负责管理其完整的生命周期。Spring 源码逻辑简化版// AbstractBeanFactory.java public Object getBean(String name) { return doGetBean(name, null, null, false); } // doGetBean 内部包含了极其复杂的对象创建流水线 // 1. 检查一级、二级、三级缓存解决循环依赖问题 // 2. 实例化对象 (Instantiation) // 3. 属性填充 (Populate Bean - 依赖注入发生在这里) // 4. 初始化 (Initialization - 调用 init-method, PostConstruct 等) // 5. 注册销毁回调3.2 用户级工厂FactoryBean接口重点这是 Spring 提供给开发者的一种**“作弊代码”**也是很多开源框架如 MyBatis, Feign, Dubbo整合 Spring 时的首选扩展点。痛点有些对象的创建过程极其复杂不是简单的new就能搞定。例如 MyBatis 的SqlSessionFactory需要解析 XML 配置文件、配置数据源、构建 Configuration 对象、扫描 Mapper 接口等。如果强制用 XMLbean或Bean注解配置代码会显得非常臃肿且难以维护。解决方案实现FactoryBean接口。Spring 容器在初始化时如果发现一个 Bean 实现了这个接口它通过getBean返回的就不是这个 Bean 本身而是它“生产”出来的对象。代码示例// 这是一个工厂 Bean但它生产的是 ComplexObject public class MyComplexObjectFactory implements FactoryBeanComplexObject { Override public ComplexObject getObject() throws Exception { ComplexObject obj new ComplexObject(); // 这里可以写几百行复杂的初始化代码比如建立 TCP 连接 obj.connectToRemote(); obj.optimize(); return obj; } Override public Class? getObjectType() { return ComplexObject.class; } Override public boolean isSingleton() { return true; // 控制生产的对象是否是单例 } }源码细节与使用技巧* 当你配置了idmyComplexObjectFactory的 Bean 时调用getBean(myComplexObjectFactory)返回的是getObject()方法产出的ComplexObject对象。如果你真的想要获取这个工厂对象本身例如为了查看其状态需要在 Bean 名称前加一个前缀即getBean(myComplexObjectFactory)。三、代理模式 (Proxy Pattern)代理模式是 Spring AOP面向切面编程的灵魂。它的核心在于在不改变原有业务逻辑源码的情况下动态地增强对象的功能。这就是我们常说的“非侵入式”开发。1. 基础形态静态代理 (Static Proxy)特点代理类和目标类实现相同的接口。代理类内部持有目标类的引用。缺点必须手动编写代理类。如果有 100 个不同的 Service 类都需要加日志功能你就得写 100 个对应的代理类或者修改现有的 100 个类。这会导致严重的类爆炸问题维护成本极高。2. 进阶形态JDK 动态代理 (JDK Dynamic Proxy)实现原理基于 Java 的反射机制。利用Proxy.newProxyInstance方法在程序运行时动态在内存中构建出代理类的字节码。硬性要求目标类必须实现至少一个接口。因为 JDK 生成的代理类默认继承了Proxy类由于 Java 是单继承的所以它只能通过实现接口来伪装成目标对象。代码骨架public class JdkProxyHandler implements InvocationHandler { private Object target; // 真实的业务对象 public JdkProxyHandler(Object target) { this.target target; } Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println( [AOP] 开启事务 / 记录日志); // 前置增强 // 利用反射调用目标对象的真实方法 Object result method.invoke(target, args); System.out.println( [AOP] 提交事务 / 资源清理); // 后置增强 return result; } }3. 进阶形态CGLIB 动态代理实现原理基于 ASM 底层字节码框架。它不通过接口而是直接在运行时动态生成目标类的子类并重写父类的非 final 方法。适用场景目标类没有实现接口或者是普通的类。限制* 目标类不能是final的因为无法被继承。目标方法不能是final或static的因为无法被重写拦截。4. Spring 中的 AOP 源码实现Spring 在DefaultAopProxyFactory中通过策略模式来智能决定使用哪种代理方式尽量保证功能的全面性与性能的平衡// DefaultAopProxyFactory.java 源码片段解析 public AopProxy createAopProxy(AdvisedSupport config) { // 逻辑判断顺序 // 1. config.isOptimize(): 是否开启了特定的优化很少用 // 2. config.isProxyTargetClass(): 是否在配置中强制指定了 proxy-target-classtrue // 3. hasNoUserSuppliedProxyInterfaces(): 目标类是否根本没有实现任何接口 if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { // 如果满足上述任一条件使用 CGLIB 代理 return new ObjenesisCglibAopProxy(config); } else { // 默认情况下如果目标类实现了接口使用 JDK 动态代理 return new JdkDynamicAopProxy(config); } }SpringBoot 的默认行为变化值得注意的是在 SpringBoot 2.x 之后为了解决代理对象在类型转换时的异常比如UseService接口代理后无法强转回UserServiceImplSpringBoot 默认将proxy-target-class设置为true即倾向于默认使用 CGLIB除非你显式配置使用 JDK 代理。常见坑点自调用失效如果在同一个类中方法 A 调用了方法 B而方法 B 上配置了 AOP如 Transactional通过 this.B() 调用时事务是不会生效的。因为 this 指代的是目标对象本身而不是代理对象从而绕过了增强逻辑。四、适配器模式 (Adapter Pattern)适配器模式的核心作用是**“翻译”或“兼容”**。它让两个原本接口不兼容的类可以协同工作就像电源适配器将 220V 电压转换为电脑需要的 20V 一样。1. 基础形态对象适配器通过组合Composition的方式将一个既有的对象包装进适配器中从而实现目标接口。// 目标接口客户端只认识这个接口需要一个 5V 的电压 interface DC5 { int output5V(); } // 现有类Adaptee只有 220V 的电压输出能力 class AC220 { public int output220V() { return 220; } } // 适配器Adapter实现目标接口持有现有类的引用 class PowerAdapter implements DC5 { private AC220 ac220; // 组合现有类 public PowerAdapter(AC220 ac220) { this.ac220 ac220; } Override public int output5V() { int src ac220.output220V(); // 适配逻辑进行降压转换 return src / 44; } }2. Spring 中的宏大叙事HandlerAdapterSpring MVC 是适配器模式的教科书级应用。背景Spring MVC 极其灵活它的 Controller处理器写法非常多变实现传统的Controller接口。实现HttpRequestHandler接口用于静态资源或简单服务。使用RequestMapping注解的 POJO 方法最常用即HandlerMethod。问题DispatcherServlet核心前端控制器如何调用这些五花八门的 Controller它不能在核心代码里写死一堆if (handler instanceof Controller) ... else if ...这不符合开闭原则。Spring 的解法定义统一的适配器接口HandlerAdapter通过适配器来屏蔽不同处理器之间的差异。public interface HandlerAdapter { // 1. 也就是策略模式的匹配你能不能处理这个 handler? // 例如 RequestMappingHandlerAdapter 专门处理 RequestMapping 的方法 boolean supports(Object handler); // 2. 统一调用动作不管那个 handler 内部多复杂你最后必须给我返回 ModelAndView // 适配器负责反射调用 Controller 的具体方法并处理参数绑定、返回值封装 ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; }执行流程详解请求到达用户发送 HTTP 请求到达DispatcherServlet。查找处理器DispatcherServlet根据 URL 找到对应的 Handler如一个 Controller 的方法。查找适配器遍历所有注册的HandlerAdapter调用supports()。比如对于RequestMapping方法会找到RequestMappingHandlerAdapter。执行逻辑调用adapter.handle()。适配器内部会处理复杂的参数解析RequestParam,RequestBody执行业务逻辑最后统一返回结果。这就是为什么你可以随意切换 Controller 的写法甚至可以是 Servlet而不需要修改 DispatcherServlet 的任何核心代码。五、策略模式 (Strategy Pattern)策略模式核心在于**“算法的动态切换”**。它定义了一系列算法并将每个算法封装起来使它们可以互换。这让算法的变化独立于使用算法的客户。1. 基础实现通常包含三个角色Strategy抽象策略接口、ConcreteStrategy具体策略实现、Context上下文持有接口引用。// 1. 策略接口 interface PaymentStrategy { void pay(int amount); } // 2. 具体策略 class AlipayStrategy implements PaymentStrategy { public void pay(int amount) { System.out.println(支付宝支付 amount); } } class WechatStrategy implements PaymentStrategy { public void pay(int amount) { System.out.println(微信支付 amount); } } // 3. 上下文 class OrderService { // 可以通过构造函数或 Setter 注入具体的策略 public void processOrder(PaymentStrategy strategy) { // 业务逻辑... // 这里的调用是多态的无需写 if(type alipay) else ... strategy.pay(100); } }2. Spring 中的资源加载 (Resource)Spring 需要加载各种资源XML、Properties、图片。资源可能在 classpath 下也可能在文件系统中或者在 URL 上。策略接口Resource定义了getInputStream(),exists(),getDescription()等统一方法。具体策略ClassPathResource: 针对类路径下的资源classpath:。FileSystemResource: 针对文件系统中的资源file:。UrlResource: 针对网络上的资源http:,https:。ByteArrayResource: 针对内存中的字节数组。上下文ContextResourceLoader。当你调用resourceLoader.getResource(classpath:config.xml)时Spring 内部会解析路径前缀classpath:并自动选择ClassPathResource策略来处理后续的 IO 操作。3. Spring 中的 Bean 实例化 (InstantiationStrategy)这是更底层的应用。Spring 在创建 Bean 时到底是用Constructor.newInstance()标准的 JDK 反射还是用 CGLIB 生成子类Spring 定义了InstantiationStrategy接口。默认实现SimpleInstantiationStrategy。它使用反射来实例化 Bean。特殊情况如果 Bean 配置了lookup-method或replaced-method方法注入Spring 需要重写 Bean 的方法。此时策略会切换为CglibSubclassingInstantiationStrategy通过生成子类的方式来实现实例化。六、模板模式 (Template Method Pattern)模板模式的核心在于**“复用骨架定制细节”**。它遵循“好莱坞原则”Dont call us, well call you。父类控制整个流程的控制权只将特定的步骤钩子Hook留给子类实现。1. 经典继承式模板abstract class AbstractGame { // 模板方法final 禁止重写保证核心流程不被篡改 public final void play() { initialize(); startPlay(); endPlay(); } // 留给子类实现的钩子方法 abstract void initialize(); abstract void startPlay(); abstract void endPlay(); }2. Spring 的变体模板 回调 (Template Callback)经典的模板模式依赖继承但 Java 是单继承的且继承体系过深会导致系统僵化。Spring 创造性地结合了回调接口让你不需要继承就能享受模板模式的红利。以JdbcTemplate为例这是 Spring 对 JDBC 操作的封装模板部分JdbcTemplate负责那些冗余、易错且标准的流程从 DataSource 获取数据库连接。创建 PreparedStatement。统一异常处理将 SQL 异常Checked Exception转换为 Spring 的 DataAccessExceptionRuntime Exception这是 Spring DAO 层的一大亮点。执行核心 SQL这是变化的。释放资源无论成功失败确保 ResultSet, Statement, Connection 依次关闭防止内存泄漏。回调部分RowMapper / PreparedStatementSetter开发者只需要实现这一小部分逻辑比如如何将 ResultSet 的一行数据映射为一个 Java 对象。代码伪逻辑演示class JdbcTemplate { public T T query(String sql, RowMapperT rowMapper) { Connection con null; Statement stmt null; ResultSet rs null; try { con dataSource.getConnection(); // 标准步骤 stmt con.createStatement(); // 标准步骤 rs stmt.executeQuery(sql); // 标准步骤 // --- 核心变化点反向调用用户的回调代码 --- ListT results new ArrayList(); int rowNum 0; while(rs.next()) { // Dont call us, well call you results.add(rowMapper.mapRow(rs, rowNum)); } // ------------------------------------- return results; } catch (SQLException ex) { // 异常转换逻辑 throw translateException(StatementCallback, sql, ex); } finally { // 坚如磐石的资源释放 JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(stmt); JdbcUtils.closeConnection(con); } } }这种“Template Method with Callback”的设计在 Spring 中无处不在统一以Template结尾RestTemplate,JmsTemplate,TransactionTemplate,RedisTemplate。七、观察者模式 (Observer Pattern)观察者模式又称发布-订阅Publish/Subscribe模式。核心在于解耦。当一个对象状态改变时通知所有依赖它的对象而不需要知道这些对象是谁。1. 基础实现Java 原生提供了Observable类和Observer接口但在 Java 9 中已被标记为废弃现在的最佳实践通常是自己定义监听器接口或者使用 Guava EventBus / Spring Event。2. Spring 的事件驱动模型 (Event-Driven)Spring 提供了一套完善的进程内事件机制完全基于观察者模式。四大核心组件Event (事件)继承ApplicationEvent封装具体的业务数据。Listener (监听器/观察者)实现ApplicationListener接口或使用EventListener注解。Publisher (发布者)ApplicationContext继承了ApplicationEventPublisher接口具备发布能力。Multicaster (广播器)ApplicationEventMulticaster这是幕后黑手负责管理所有注册的监听器并将事件准确派发给它们。工作流程源码解析注册阶段容器启动时AbstractApplicationContext会初始化SimpleApplicationEventMulticaster并将所有的ApplicationListenerBean 注册进去通常存储在一个 Set 集合中。发布阶段业务代码调用context.publishEvent(new OrderSuccessEvent(order))。广播阶段Multicaster 内部会遍历监听器列表逐个调用。// SimpleApplicationEventMulticaster.java 伪代码 public void multicastEvent(ApplicationEvent event) { for (ApplicationListener listener : getApplicationListeners(event)) { // 关键点判断是否存在 Executor (线程池) Executor executor getTaskExecutor(); if (executor ! null) { // 异步执行观察者在单独线程跑主线程立即返回适合发送邮件/短信等耗时操作 executor.execute(() - listener.onApplicationEvent(event)); } else { // 同步执行默认情况。所有监听器执行完publishEvent 方法才返回。 // 这意味着如果监听器抛出异常可能会阻断主流程取决于事务配置。 listener.onApplicationEvent(event); } } }进阶技巧事务绑定事件使用 TransactionalEventListener 注解可以控制监听器在当前事务的哪个阶段执行例如仅在事务提交成功后 AFTER_COMMIT 才发送通知。这在处理“注册成功后发优惠券”等场景时非常关键能确保数据一致性。八、深度总结设计模式背后的核心思想如果说具体的代码实现是“招式”那么设计模式背后的核心思想就是“内功”。Spring 之所以能成为 Java 世界的长青树是因为它深刻地领悟并实践了以下核心软件工程原则1. 资源复用与全局受控 (单例模式)核心思想“收敛”。解读在企业级应用中混乱的对象创建是性能杀手和 bug 之源。Spring 通过容器级的单例模式强行收敛了对象的创建权。它告诉我们对于无状态的服务组件全局一份足矣。这不仅是出于性能考虑减少 GC更是为了确保全局状态如配置、缓存的一致性。2. 创建与使用的彻底分离 (工厂模式)核心思想“解耦”。解读这是控制反转 (IoC) 的灵魂。使用者只需要声明“我想要什么”而不需要关心“它怎么来”。这种分离使得组件的替换变得异常简单例如从 MySQL 切换到 Oracle或者在测试时替换为 Mock 对象极大地提升了系统的可维护性。3. 非侵入式的逻辑增强 (代理模式)核心思想“隔离”。解读业务逻辑应该是纯粹的。记录日志、管理事务、权限校验这些“脏活累活”不应该污染核心业务代码。代理模式通过在运行时动态“套壳”实现了关注点分离 (Separation of Concerns)。它保护了业务代码的纯洁性同时赋予了它强大的附加能力。4. 求同存异的兼容艺术 (适配器模式)核心思想“包容”。解读现实世界是复杂的标准永远在变。HandlerAdapter 的存在证明了框架不应该强迫用户改变而应该改变自己去适应用户。只要你能完成任务无论你是哪种形式的 ControllerSpring 都能通过适配器接纳你。这是 Spring 生态繁荣的关键。5. 把选择权交给运行时 (策略模式)核心思想“灵活”。解读避免在代码中写死逻辑。通过定义统一的接口ResourceSpring 允许系统在运行时根据环境是本地文件还是网络 URL动态选择最合适的处理算法。这是开闭原则 (Open/Closed Principle)的最佳实践对扩展开放对修改关闭。6. 流程标准化与细节定制化 (模板模式)核心思想“规范”。解读好莱坞原则Dont call us, well call you。Spring 极其擅长定义标准流程打开连接 - 执行 - 关闭它把易错的、重复的样板代码锁死在模板里只把那一点点变化的业务逻辑留给开发者填空。这既保证了程序的健壮性又降低了开发者的心智负担。7. 组件间的极致松耦合 (观察者模式)核心思想“联动”。解读系统越复杂模块间的直接依赖就越危险。观察者模式通过“事件”这一中间媒介打断了模块间的直接调用链。A 模块只管发消息B、C、D 模块听到消息后各自干活大家互不认识却能完美配合。这是构建大型分布式系统的基石。九、总结对照表模式Spring 核心组件一句话设计哲学单例模式DefaultSingletonBeanRegistry资源共享全局唯一避免重复创建集中管理状态。工厂模式BeanFactory / FactoryBean封装复杂性不要让用户自己new对象尤其是构建过程复杂的对象。代理模式AOP / Transaction非侵入式增强想加功能日志/事务别改老代码动态套一层壳即可。适配器模式HandlerAdapter兼容并包不管你长什么样Controller写法我都提供转换头让你能对接。策略模式Resource / InstantiationStrategy拥抱变化条条大路通罗马运行时根据环境决定走哪条路。模板模式JdbcTemplate / RestTemplate标准化流程脏活累活框架干核心业务逻辑你来填。观察者模式ApplicationEvent极致解耦你干你的我干我的有事发个广播就行互不依赖。深入理解这 7 种模式在 Spring 中的实现你就不仅仅是在使用一个框架而是在与一位顶级的架构师Spring 的设计者们进行跨时空的对话。