欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Spring中用到的设计模式详解

Spring中用到的设计模式详解

2025/5/24 13:12:50 来源:https://blog.csdn.net/m0_66220639/article/details/148087766  浏览:    关键词:Spring中用到的设计模式详解

        Spring 在设计和实现过程中大量使用了设计模式,这些设计模式不仅提升了 Spring 的灵活性和可扩展性,还为开发者提供了更高效、更优雅的编程方式。以下是 Spring 框架中使用的一些常见设计模式:

1. 单例模式(Singleton Pattern)

  • 定义:确保一个类只有一个实例,并提供全局访问点。

  • Spring 应用

    • Spring 默认将 Bean 的作用域设置为单例(singleton),由 IOC容器管理生命周期。

  • 示例

    @Service  // 默认就是单例
    public class OrderService {// 业务逻辑
    }

2. 工厂模式(Factory Pattern)

  • 定义:通过工厂类封装对象的创建逻辑,解耦客户端与具体实现。

  • Spring 应用

    • BeanFactory 和 ApplicationContext 是核心工厂,负责创建和管理 Bean。

    • FactoryBean 接口允许自定义复杂对象的创建逻辑(如 MyBatis 的 SqlSessionFactoryBean)。

  • 优点:将对象的创建和使用分离,降低了耦合度。

  • 示例

    // BeanFactory 是一个工厂接口
    BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("applicationContext.xml"));
    SingletonBean singletonBean = beanFactory.getBean(SingletonBean.class);

3. 代理模式(Proxy Pattern) 

  • 定义:通过代理对象控制对真实对象的访问。

  • Spring 应用:

    • 接口代理:使用JDK动态代理(基于接口)

    • 类代理:使用CGLIB字节码生成

  • 应用场景

    • AOP切面编程

    • 声明式事务管理

    • @Async异步方法

  • 示例

    @Transactional  // 通过代理实现事务管理
    public void placeOrder(Order order) {// 业务逻辑
    }

4. 模板方法模式(Template Method Pattern) 

  • 定义:定义算法骨架,将某些步骤延迟到子类实现

  • Spring 应用

    • JdbcTemplateRestTemplate 等模板类封装了资源管理(如连接、异常处理),用户只需实现回调。

  • 示例

    public class JdbcTemplateExample {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<String> getNames() {return jdbcTemplate.query("SELECT name FROM users",(rs, rowNum) -> rs.getString("name"));}
    }

5. 适配器模式(Adapter Pattern) 

  • 定义:将一个类的接口转换成客户希望的另一个接口。

  • 在 Spring 中的应用

    • HandlerAdapter:适配不同风格的控制器(如Servlet、注解式控制器)

    • AOP中的适配器:将各种Advice适配为MethodInterceptor

    • 安全配置适配器

  • 示例

    // 将一个普通POJO适配为Spring MVC控制器
    @Controller
    public class SimpleController {@RequestMapping("/hello")public String hello() {return "greeting";}
    }

6. 观察者模式(Observer Pattern) 

  • 定义:对象间一种一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。

  • 在 Spring 中的应用

    • 事件驱动模型:通过 ApplicationEvent(事件)和 ApplicationListener(监听器)实现。如 ContextRefreshedEvent(容器刷新完成事件)。

  • 示例

    // 定义事件
    public class CustomEvent extends ApplicationEvent {public CustomEvent(Object source) {super(source);}
    }// 监听事件
    @Component
    public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {// 处理事件}
    }// 发布事件
    applicationContext.publishEvent(new CustomEvent(this));

7. 策略模式(Strategy Pattern) 

  • 定义:定义一系列的算法,把它们一个个封装起来,并使它们可互换。

  • 在 Spring 中的应用

    • 资源加载Resource 接口的不同实现(ClassPathResourceUrlResource)。

    • 事务管理:支持多种事务策略(JDBC、JTA)

  • 示例

    Resource resource = new ClassPathResource("applicationContext.xml");
    Resource resource2 = new FileSystemResource("/conf/applicationContext.xml");

 8. 装饰器模式(Decorator Pattern)

  • 定义:动态地给一个对象添加额外的职责。

  • 在 Spring 中的应用HttpServletRequestWrapper装饰HTTP请求。

  • 示例

    public class CustomRequestWrapper extends HttpServletRequestWrapper {public CustomRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {// 装饰原始方法String value = super.getParameter(name);return value != null ? value.toUpperCase() : null;}
    }

9. 责任链模式 (Chain of Responsibility Pattern)

  • 定义:允许将请求沿着处理链传递,直到有一个处理者能够处理它为止。该模式通过为多个处理者提供处理请求的机会,从而解耦请求的发送者和接收者。

  • 在 Spring 中的应用

    • Spring Security的过滤器链

    • Spring MVC的拦截器链

  • 示例

    public class SecurityFilterChain {private List<Filter> filters;public void doFilter(ServletRequest request, ServletResponse response) {// 依次调用过滤器}
    }

10. 组合模式(Composite Pattern)

  • 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。

  • 在 Spring 中的应用

    • Spring表达式语言(SpEL)中的表达式组合

    • CompositeCacheManager组合多个缓存管理器

  • 示例

    public class CompositeCacheManager implements CacheManager {private List<CacheManager> cacheManagers;// 组合多个CacheManager的功能
    }

11. 建造者模式(Builder Pattern) 

  • 定义:逐步构造一个复杂的对象,并允许用户只通过指定复杂对象的类型和内容就能构建它们。

  • 在 Spring 中的应用

    • BeanDefinitionBuilder用于构建Bean定义

    • UriComponentsBuilder用于构建URI

  • 示例

    BeanDefinition beanDefinition =  BeanDefinitionBuilder.genericBeanDefinition(MyBean.class)
    .addPropertyValue("name", "Kimi");
    .addPropertyValue("age", 25);
    .getBeanDefinition();

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词