Spring Boot 设计模式总结
概述
Spring Boot 在设计和实现过程中大量运用了经典的设计模式,这些模式使得框架具有高度的可扩展性、可维护性和灵活性。本文将系统总结 Spring Boot 中使用的主要设计模式。
一、创建型模式
1.1 工厂模式(Factory Pattern)
应用场景
Spring Boot 使用工厂模式创建不同类型的对象,根据条件动态决定创建哪种具体实现。
代码示例
// ApplicationContextFactory - 根据Web类型创建不同的应用上下文@FunctionalInterfacepublicinterfaceApplicationContextFactory{ConfigurableApplicationContextapply(WebApplicationTypewebApplicationType);ApplicationContextFactoryDEFAULT=(webApplicationType)->{try{returnswitch(webApplicationType){caseSERVLET->newAnnotationConfigServletWebServerApplicationContext();caseREACTIVE->newAnnotationConfigReactiveWebServerApplicationContext();default->newAnnotationConfigApplicationContext();};}catch(Exceptionex){thrownewIllegalStateException(...);}};}// WebServerFactory - 创建不同的嵌入式容器publicinterfaceWebServerFactory{WebServergetWebServer(ServletContextInitializer...initializers);}publicclassTomcatServletWebServerFactoryimplementsWebServerFactory{@OverridepublicWebServergetWebServer(ServletContextInitializer...initializers){Tomcattomcat=newTomcat();// 配置TomcatreturnnewTomcatWebServer(tomcat);}}优点
- 解耦: 将对象创建与使用分离
- 扩展性: 易于添加新的产品类型
- 统一接口: 通过统一接口创建对象
缺点
- 增加系统复杂度
- 需要额外的工厂类
1.2 建造者模式(Builder Pattern)
应用场景
用于构建复杂的配置对象,如 SpringApplication、各种 Properties 对象等。
代码示例
// SpringApplicationBuilderpublicclassSpringApplicationBuilder{privatefinalSpringApplicationapplication;privateConfigurableApplicationContextcontext;publicSpringApplicationBuilder(Class<?>...sources){this.application=newSpringApplication(sources);}publicSpringApplicationBuilderbannerMode(Banner.ModebannerMode){this.application.setBannerMode(bannerMode);returnthis;}publicSpringApplicationBuilderweb(WebApplicationTypewebApplicationType){this.application.setWebApplicationType(webApplicationType);returnthis;}publicSpringApplicationBuilderprofiles(String...profiles){this.application.setAdditionalProfiles(profiles);returnthis;}publicSpringApplicationBuilderproperties(String...defaultProperties){this.application.setDefaultProperties(...);returnthis;}publicConfigurableApplicationContextrun(String...args){this.context=this.application.run(args);returnthis.context;}}// 使用示例newSpringApplicationBuilder(MyApplication.class).bannerMode(Banner.Mode.OFF).web(WebApplicationType.SERVLET).profiles("prod").properties("server.port=8080").run(args);优点
- 链式调用: 代码可读性强
- 可选参数: 灵活设置配置项
- 不可变性: 可以创建不可变对象
1.3 单例模式(Singleton Pattern)
应用场景
Spring 容器中的 Bean 默认就是单例模式,Spring Boot 中也广泛使用。
代码示例
// SpringApplicationShutdownHook - 单例实现publicfinalclassSpringApplicationShutdownHookimplementsRunnable{// 静态内部类实现懒加载单例privatestaticclassHook{privatestaticfinalSpringApplicationShutdownHookINSTANCE=newSpringApplicationShutdownHook();}publicstaticSpringApplicationShutdownHookgetInstance(){returnHook.INSTANCE;}privateSpringApplicationShutdownHook(){// 私有构造函数}}// 枚举单例(最安全的实现)publicenumApplicationStartup{DEFAULT;publicvoidstart(Stringname){// ...}}优点
- 节省资源: 只有一个实例
- 全局访问: 方便共享状态
- 线程安全: 可以控制并发访问
二、结构型模式
2.1 外观模式(Facade Pattern)
应用场景
Starter 机制就是外观模式的典型应用,将复杂的依赖关系和配置封装起来。
代码示例
// spring-boot-starter-web 作为一个外观// 内部包含:// - spring-boot-starter// - spring-boot-starter-json// - spring-boot-starter-tomcat// - spring-webmvc// 用户只需要引入一个依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web&