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 {
        @Autowired
        private 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> {
        @Override
        public 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);
        }
        
        @Override
        public 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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值