Java 设计模式在 Spring 中的现代应用:构建优雅的企业级应用

张开发
2026/4/5 0:59:38 15 分钟阅读

分享文章

Java 设计模式在 Spring 中的现代应用:构建优雅的企业级应用
Java 设计模式在 Spring 中的现代应用构建优雅的企业级应用别叫我大神叫我 Alex 就好。一、引言大家好我是 Alex。设计模式是软件设计中经过验证的解决方案它们帮助我们解决常见的设计问题。Spring 框架作为 Java 企业级应用的主流框架大量应用了各种设计模式。今天我想和大家分享一下 Java 设计模式在 Spring 中的现代应用帮助大家构建更优雅、更可维护的企业级应用。二、创建型模式1. 单例模式Spring 中的应用Bean 注解默认情况下Spring 容器中的 Bean 都是单例的Scope(singleton)显式指定单例作用域Configuration public class AppConfig { Bean Scope(singleton) public UserService userService() { return new UserServiceImpl(); } }现代实践合理使用单例模式避免全局状态结合 Spring 的依赖注入减少手动单例管理2. 工厂方法模式Spring 中的应用FactoryBean 接口用于创建复杂的 BeanBeanFactorySpring 容器的核心接口public class UserFactoryBean implements FactoryBeanUser { private String username; Override public User getObject() throws Exception { User user new User(); user.setUsername(username); return user; } Override public Class? getObjectType() { return User.class; } Override public boolean isSingleton() { return true; } public void setUsername(String username) { this.username username; } }现代实践使用 Lambda 表达式简化工厂方法结合 Spring Boot 的自动配置3. 建造者模式Spring 中的应用Builder 注解结合 Lombok 使用BeanDefinitionBuilder用于构建 Bean 定义Data Builder public class User { private Long id; private String username; private String email; } // 使用建造者模式创建对象 User user User.builder() .id(1L) .username(alex) .email(alexexample.com) .build();现代实践结合 Lombok 简化建造者模式的实现使用流式 API 提高代码可读性三、结构型模式1. 代理模式Spring 中的应用AOP (Aspect-Oriented Programming)基于代理实现JDK 动态代理接口代理CGLIB 代理类代理Aspect Component public class LoggingAspect { Before(execution(* com.example.service.*.*(..))) public void logBefore(JoinPoint joinPoint) { System.out.println(Before method: joinPoint.getSignature().getName()); } AfterReturning(pointcut execution(* com.example.service.*.*(..)), returning result) public void logAfterReturning(JoinPoint joinPoint, Object result) { System.out.println(After method: joinPoint.getSignature().getName()); System.out.println(Return value: result); } }现代实践使用注解驱动的 AOP结合 Spring Boot 的自动配置2. 适配器模式Spring 中的应用HandlerAdapter处理不同类型的处理器WebMvcConfigurerAdapter配置 Spring MVCConfiguration public class WebConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*); } }现代实践使用函数式接口和 Lambda 表达式结合 Spring Boot 的自动配置3. 装饰器模式Spring 中的应用BeanPostProcessorBean 初始化前后的处理HttpMessageConverter消息转换的装饰Component public class CustomBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof UserService) { System.out.println(Before initializing UserService); } return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof UserService) { System.out.println(After initializing UserService); } return bean; } }现代实践使用注解驱动的装饰结合 Spring Boot 的自动配置四、行为型模式1. 观察者模式Spring 中的应用ApplicationEvent应用事件ApplicationListener事件监听器// 定义事件 public class UserCreatedEvent extends ApplicationEvent { private User user; public UserCreatedEvent(Object source, User user) { super(source); this.user user; } public User getUser() { return user; } } // 发布事件 Service public class UserService { Autowired private ApplicationEventPublisher eventPublisher; public User createUser(User user) { // 保存用户 // ... // 发布事件 eventPublisher.publishEvent(new UserCreatedEvent(this, user)); return user; } } // 监听事件 Component public class UserCreatedListener implements ApplicationListenerUserCreatedEvent { Override public void onApplicationEvent(UserCreatedEvent event) { User user event.getUser(); System.out.println(User created: user.getUsername()); // 发送邮件、记录日志等 } }现代实践使用 EventListener 注解结合异步事件处理2. 策略模式Spring 中的应用HandlerMapping不同的请求映射策略DataSource不同的数据源策略public interface PaymentStrategy { void pay(double amount); } Service(alipay) public class AlipayStrategy implements PaymentStrategy { Override public void pay(double amount) { System.out.println(Paying amount via Alipay); } } Service(wechat) public class WechatPayStrategy implements PaymentStrategy { Override public void pay(double amount) { System.out.println(Paying amount via Wechat Pay); } } Service public class PaymentService { Autowired private MapString, PaymentStrategy paymentStrategies; public void pay(String type, double amount) { PaymentStrategy strategy paymentStrategies.get(type); if (strategy null) { throw new IllegalArgumentException(Invalid payment type); } strategy.pay(amount); } }现代实践使用 Qualifier 注解选择策略结合 Spring Boot 的条件配置3. 模板方法模式Spring 中的应用JdbcTemplate数据库操作模板RestTemplateREST 操作模板Service public class UserService { Autowired private JdbcTemplate jdbcTemplate; public User findUserById(Long id) { return jdbcTemplate.queryForObject( SELECT * FROM users WHERE id ?, new Object[]{id}, (rs, rowNum) - { User user new User(); user.setId(rs.getLong(id)); user.setUsername(rs.getString(username)); user.setEmail(rs.getString(email)); return user; } ); } }现代实践使用 Lambda 表达式简化模板方法结合 Spring Boot 的自动配置五、Spring 特有的设计模式1. 依赖注入模式Spring 中的应用Autowired自动注入依赖InjectJSR-330 标准注入ResourceJSR-250 标准注入Service public class UserService { private final UserRepository userRepository; private final EmailService emailService; Autowired public UserService(UserRepository userRepository, EmailService emailService) { this.userRepository userRepository; this.emailService emailService; } // 业务方法 }现代实践使用构造器注入避免循环依赖结合 Lombok 的 RequiredArgsConstructor2. 控制反转模式Spring 中的应用ApplicationContextSpring 容器BeanFactoryBean 工厂public class Application { public static void main(String[] args) { ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class); UserService userService context.getBean(UserService.class); // 使用 userService } }现代实践使用 Spring Boot 的自动配置结合 ComponentScan 自动扫描3. 配置元数据模式Spring 中的应用Configuration配置类BeanBean 定义Value属性注入Configuration PropertySource(classpath:application.properties) public class AppConfig { Value(${database.url}) private String databaseUrl; Value(${database.username}) private String databaseUsername; Value(${database.password}) private String databasePassword; Bean public DataSource dataSource() { DriverManagerDataSource dataSource new DriverManagerDataSource(); dataSource.setUrl(databaseUrl); dataSource.setUsername(databaseUsername); dataSource.setPassword(databasePassword); return dataSource; } }现代实践使用 ConfigurationProperties 批量注入属性结合 Spring Boot 的 application.yml 配置六、最佳实践1. 合理选择设计模式根据具体场景选择合适的设计模式避免过度设计保持简单结合 Spring 的特性简化模式实现2. 结合 Spring Boot使用 Spring Boot 的自动配置利用 Spring Boot 的 starters遵循 Spring Boot 的约定优于配置3. 代码质量保持代码简洁明了遵循 SOLID 原则编写单元测试七、实战案例案例电商系统订单处理需求支持多种支付方式订单状态管理异步处理订单事件实现// 策略模式支付策略 public interface PaymentStrategy { void pay(Order order); } // 观察者模式订单事件 public class OrderCreatedEvent extends ApplicationEvent { private Order order; // 构造器和 getter } // 模板方法模式订单处理模板 public abstract class OrderProcessingTemplate { public final void process(Order order) { validate(order); processPayment(order); updateStatus(order); notifyListeners(order); } protected abstract void validate(Order order); protected abstract void processPayment(Order order); protected abstract void updateStatus(Order order); protected abstract void notifyListeners(Order order); } Service public class OnlineOrderProcessor extends OrderProcessingTemplate { // 实现抽象方法 }八、总结设计模式是构建高质量软件的重要工具Spring 框架为我们提供了丰富的模式实现。通过合理应用这些模式我们可以构建出更优雅、更可维护的企业级应用。这其实可以更优雅一点。希望这篇文章能帮助大家更好地理解和应用设计模式。如果你有任何问题欢迎在评论区留言。关于作者我是 Alex一个在 CSDN 写 Java 架构思考的暖男。喜欢手冲咖啡养了一只叫Java的拉布拉多。如果我的文章对你有帮助欢迎关注我一起探讨 Java 技术的优雅之道。

更多文章