当前位置: 首页 > news >正文

设计模式在Spring中的应用

设计模式在Spring中的应用

引言

Spring框架是Java企业级开发的事实标准,其设计本身就大量运用了经典设计模式。深入理解这些设计模式,不仅能帮助我们更好地使用Spring,还能提升整体架构设计能力。本文将从创建型、结构型、行为型三个维度,系统分析设计模式在Spring框架中的具体应用场景和实现原理。

一、创建型模式

1.1 单例模式

Spring默认将所有Bean作为单例管理,通过BeanFactory实现单例Bean的创建和缓存。

// Spring通过DefaultSingletonBeanRegistry实现单例 public class DefaultSingletonBeanRegistry { // 单例缓存 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(); // 获取单例Bean protected Object getSingleton(String beanName) { Object singleton = singletonObjects.get(beanName); if (singleton == null) { singleton = createSingleton(beanName); singletonObjects.put(beanName, singleton); } return singleton; } } // Spring配置单例 @Configuration public class SingletonConfig { @Bean @Scope("singleton") // 默认就是单例 public UserService userService() { return new UserService(); } }

1.2 工厂模式

Spring的BeanFactory是工厂模式的典型应用,BeanDefinitionRegistry负责Bean的注册管理。

// 抽象工厂 public interface BeanFactory { Object getBean(String name); <T> T getBean(Class<T> requiredType); <T> T getBean(String name, Class<T> type); } // 工厂Bean接口 public interface FactoryBean<T> { T getObject(); Class<?> getObjectType(); boolean isSingleton(); } // 自定义工厂Bean @Component public class ConnectionFactoryBean implements FactoryBean<Connection> { @Override public Connection getObject() { return createConnection(); } @Override public Class<Connection> getObjectType() { return Connection.class; } }

1.3 建造者模式

Spring的EmbeddedDatabaseBuilder、MockMvcBuilders等使用了建造者模式。

// Spring的建造者模式示例 @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .setName("testdb") .addScript("classpath:schema.sql") .addScript("classpath:data.sql") .build(); } // MockMvcBuilders的建造者模式 private MockMvc mockMvc = MockMvcBuilders .webAppContextSetup(webApplicationContext) .filters(new CharacterEncodingFilter("UTF-8", true)) .apply(springSecurity()) .build();

二、结构型模式

2.1 代理模式

Spring AOP基于代理模式实现,提供了JDK动态代理和CGLIB两种代理方式。

// JDK动态代理接口 public interface UserService { void createUser(User user); } // JDK动态代理实现 public class JdkProxyHandler implements InvocationHandler { private final Object target; public JdkProxyHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 前置增强 before(method); Object result = method.invoke(target, args); // 后置增强 after(method); return result; } } // 代理工厂 public class ProxyFactory { public static <T> T createProxy(T target, Class<T> interface_) { return (T) Proxy.newProxyInstance( interface_.getClassLoader(), new Class[]{interface_}, new JdkProxyHandler(target) ); } }

2.2 装饰器模式

Spring的IOUtils、HttpInputMessage等使用了装饰器模式增强功能。

// 装饰器模式示例:缓存装饰器 public class CachedUserRepository implements UserRepository { private final UserRepository target; private final Cache cache; public CachedUserRepository(UserRepository target, Cache cache) { this.target = target; this.cache = cache; } @Override public Optional<User> findById(Long id) { String key = "user:" + id; return cache.get(key, () -> target.findById(id)); } @Override public User save(User user) { User saved = target.save(user); cache.evict("user:" + saved.getId()); return saved; } }

2.3 适配器模式

Spring MVC的HandlerAdapter和Spring Security的AuthenticationProvider都使用了适配器模式。

// 通用处理器接口 public interface HandlerAdapter { boolean supports(Object handler); ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler); } // Spring MVC的适配器实现 public class RequestMappingHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return handler instanceof HandlerMethod; } @Override public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) { HandlerMethod handlerMethod = (HandlerMethod) handler; // 适配处理 return invokeHandlerMethod(request, response, handlerMethod); } }

三、行为型模式

3.1 模板方法模式

Spring的JdbcTemplate、HibernateTemplate等使用模板方法封装重复逻辑。

// JdbcTemplate的模板方法模式 public abstract class JdbcAccessor { protected DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } } public class JdbcTemplate extends JdbcAccessor { public <T> T execute(ConnectionCallback<T> action) { Connection conn = DataSourceUtils.getConnection(dataSource); try { return action.doInConnection(conn); } finally { DataSourceUtils.releaseConnection(conn, dataSource); } } public <T> T query(String sql, RowMapper<T> rowMapper) { return execute(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); return extractData(rs, rowMapper); }); } }

3.2 策略模式

Spring的TransactionManager、ViewResolver等使用策略模式支持多种实现。

// 事务策略接口 public interface TransactionManager { TransactionStatus getTransaction( TransactionDefinition definition); void commit(TransactionStatus status); void rollback(TransactionStatus status); } // 具体策略实现 public class DataSourceTransactionManager implements TransactionManager { @Override public TransactionStatus getTransaction( TransactionDefinition definition) { // 获取数据库连接,开始事务 } } public class JpaTransactionManager implements TransactionManager { @Override public TransactionStatus getTransaction( TransactionDefinition definition) { // 获取EntityManager,开始JPA事务 } }

3.3 观察者模式

Spring的ApplicationEvent和ApplicationListener是观察者模式的实现。

// 事件 public class OrderCreatedEvent extends ApplicationEvent { private final Order order; public OrderCreatedEvent(Object source, Order order) { super(source); this.order = order; } public Order getOrder() { return order; } } // 监听器 @Component public class OrderEventListener { @EventListener public void handleOrderCreated(OrderCreatedEvent event) { Order order = event.getOrder(); // 处理订单创建事件 sendNotification(order); updateInventory(order); recordMetrics(order); } } // 发布事件 @Service public class OrderService { private final ApplicationEventPublisher publisher; public Order createOrder(Order order) { Order saved = orderRepository.save(order); publisher.publishEvent(new OrderCreatedEvent(this, saved)); return saved; } }

3.4 责任链模式

Spring Security的FilterChain和Spring Web的HandlerInterceptor使用责任链模式。

// Spring Security的过滤器链 public interface Filter { void doFilter(ServletRequest request, ServletResponse response, FilterChain chain); } public class FilterChainProxy { private List<Filter> filters; public void doFilter(ServletRequest request, ServletResponse response) { new VirtualFilterChain(request, response, filters).doFilter(); } private static class VirtualFilterChain implements FilterChain { private final ServletRequest request; private final ServletResponse response; private final List<Filter> filters; private int currentPosition = 0; @Override public void doFilter(ServletRequest request, ServletResponse response) { if (currentPosition < filters.size()) { Filter filter = filters.get(currentPosition++); filter.doFilter(request, response, this); } } } }

四、Spring Boot中的设计模式

4.1 自动配置中的策略模式

// 条件选择器 @Configuration @ConditionalOnClass(RedisTemplate.class) public class RedisAutoConfiguration { @Bean @ConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate() { return new StringRedisTemplate(); } } @Configuration @ConditionalOnClass(CacheManager.class) @ConditionalOnProperty(name = "spring.cache.type", havingValue = "redis") public class RedisCacheConfiguration { // Redis缓存配置 }

4.2 多数据源路由

// 动态数据源路由 public class RoutingDataSource extends AbstractDataSource { private final Map<Object, DataSource> targetDataSources; private DataSource determineDataSource() { String key = RoutingDataSourceHolder.getDataSourceKey(); return targetDataSources.getOrDefault(key, targetDataSources.values().iterator().next()); } } // 数据源选择策略 public interface DataSourceStrategy { String getDataSourceKey(); } @Service public class ReadWriteStrategy implements DataSourceStrategy { @Override public String getDataSourceKey() { return isReadOnly() ? "read" : "write"; } private boolean isReadOnly() { // 根据方法名或注解判断 return true; } }

五、设计模式选择建议

5.1 何时使用单例

Spring默认单例适合无状态Bean;需要保持状态的Bean应使用其他作用域或自行管理状态。

5.2 何时使用策略

当存在多种算法或实现需要动态选择时使用策略模式;可以通过@Primary注解指定默认策略。

5.3 何时使用模板方法

当存在固定流程但部分步骤需要不同实现时使用模板方法;Spring的JdbcTemplate是典型应用。

总结

Spring框架是设计模式的最佳实践案例,通过深入理解这些设计模式,我们可以更好地掌握Spring的内部机制,写出更高质量的代码。在实际应用中,应该根据具体场景选择合适的设计模式,避免过度设计,保持代码的简洁性和可维护性。

http://www.jsqmd.com/news/851206/

相关文章:

  • GEO优化服务商价格一般多少?2026年五家头部服务商定价梳理与靠谱选择 - 博客万
  • 百度网盘Mac版SVIP破解终极指南:三步解锁高速下载限制
  • FPGA高速数据流设计避坑指南:当Aurora光纤遇到XDMA和DDR时,如何保证数据不丢?
  • CANN/asc-devkit SIMD API UnPack函数
  • 保姆级教程:在Windows/Linux上为YOLOv8项目集成GradCAM热力图(避坑指南)
  • 2026Q2 西宁代理记账市场全景报告:行情解析 + 权威排行榜 + 核心推荐 - 品牌智鉴榜
  • 从电影配乐到ASMR:用FFmpeg命令行玩转音频滤镜的几种创意用法
  • AutoSar网络管理(NM)与0x28通信控制服务:搞懂主从节点,精准控制子总线流量
  • 2026届最火的十大降重复率神器解析与推荐
  • lobehubui
  • D1021UK,125W高功率输出的推挽式DMOS RF FET射频晶体管
  • IPXWrapper终极指南:让经典游戏在现代Windows系统重获联机能力
  • 分布式事务:保证分布式系统数据一致性
  • 护发精油推荐:解答护发精油哪个牌子好的6款精选 - 速递信息
  • 2026年全国医用微动力系统与无刷电机采购指南:从医院手术精度到定制化解决方案的完整对标 - 企业名录优选推荐
  • 如何求解候选键?[数据库原理]
  • git讲解,git vscode 对应,git pycharm 对应
  • Pearcleaner:Mac应用彻底清理的终极解决方案,告别数字垃圾困扰
  • 2026年医用微动力系统选型指南:国产精密电机如何破局进口垄断 - 企业名录优选推荐
  • 2026年全国医用微动力系统与无刷电机采购指南:从西安三才电子到行业深度横评 - 企业名录优选推荐
  • python的uv
  • 2026Q2苏州专业的公司注册代办机构口碑推荐,高性价比代理记账财税服务机构优选企业主避坑指南 - 品牌智鉴榜
  • 2026年医用微动力系统与无刷电机全国采购指南:从西安、北京到深圳的专科手术设备精准选型 - 企业名录优选推荐
  • 哔咔漫画下载器:如何快速构建个人离线漫画图书馆的终极指南
  • 别光看理论了!用Logisim仿真带你直观理解CPU的加法器是怎么工作的(8位可控加减法电路实战)
  • 深度解析Py-ART雷达数据处理:从数据校正到高级反演的全流程实战
  • Translumo:Windows平台实时屏幕翻译的架构革命与实践指南
  • D1027UK,具备极低反向传输电容与13dB高增益特性的射频晶体管
  • 3分钟掌握OmenSuperHub:彻底释放暗影精灵性能的终极指南
  • 2026长春黄金回收商家推荐,八家公安备案正规靠谱精选 - 生活测评君