Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架,它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。

以下是一些在 Spring 框架中常见的设计模式,以及用代码示例来解释它们:

一、工厂模式(Factory Pattern)

Spring 使用工厂模式来创建和管理对象。例如,BeanFactory 是一个接口,定义了获取不同类型 bean 的方法。

java 复制代码
// 示例代码(非实际 Spring 代码)  
public interface BeanFactory {  
    <T> T getBean(Class<T> requiredType);  
}  
  
// 实现类  
public class DefaultListableBeanFactory implements BeanFactory {  
    // ... 实现细节 ...  
  
    @Override  
    public <T> T getBean(Class<T> requiredType) {  
        // 查找并返回 bean 实例  
        return (T) findBean(requiredType);  
    }  
  
    private Object findBean(Class<?> requiredType) {  
        // 实现细节...  
        return null; // 示例返回 null  
    }  
}

二、单例模式(Singleton Pattern)

Spring 容器中的 bean 默认是单例的。这确保了每个 bean 在容器中只有一个实例。

java 复制代码
// Spring 配置文件中定义 bean 为单例  
<bean id="myBean" class="com.example.MyBean" scope="singleton" />  
  
// MyBean 类不需要任何特殊的单例模式实现  
public class MyBean {  
    // ...  
}

三、原型模式(Prototype Pattern)

虽然默认是单例,但 Spring 也支持原型模式,允许每次请求时都创建一个新的 bean 实例。

java 复制代码
// Spring 配置文件中定义 bean 为原型  
<bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype" />  
  
// MyPrototypeBean 类不需要任何特殊的原型模式实现  
public class MyPrototypeBean {  
    // ...  
}

四、代理模式(Proxy Pattern)

Spring AOP 使用了代理模式来创建代理对象,这些对象可以在方法调用前后执行额外的逻辑(如事务管理、日志记录等)。

java 复制代码
// 使用 AspectJ 或 JDK 动态代理实现的示例  
@Aspect  
@Component  
public class LoggingAspect {  
  
    @Before("execution(* com.example.*.*(..))")  
    public void logBefore(JoinPoint joinPoint) {  
        System.out.println("Method " + joinPoint.getSignature() + " is called.");  
    }  
  
    // ... 其他通知 ...  
}

五、模板方法模式(Template Method Pattern)

Spring 的 JdbcTemplate、JmsTemplate 等模板类就是模板方法模式的体现。它们定义了操作资源(如数据库、JMS 队列)的通用步骤,而将特定于应用的逻辑留给子类或回调方法来实现。

java 复制代码
// 示例代码(非实际 Spring JdbcTemplate)  
public class CustomJdbcTemplate {  
    public List<Map<String, Object>> query(String sql, RowMapper<Map<String, Object>> rowMapper) {  
        // 模板方法:打开连接、执行查询、关闭连接等  
        // ...  
  
        // 调用回调方法处理结果集  
        List<Map<String, Object>> results = new ArrayList<>();  
        while (resultSet.next()) {  
            results.add(rowMapper.mapRow(resultSet, rowNum++));  
        }  
  
        // ...  
        return results;  
    }  
}

六、观察者模式(Observer Pattern)

Spring 的事件驱动模型使用了观察者模式。当某个事件发生时,所有注册的观察者都会收到通知。

java 复制代码
// 定义一个事件  
public class MyEvent extends ApplicationEvent {  
    // ...  
}  
  
// 定义一个监听器(观察者)  
@Component  
public class MyEventListener implements ApplicationListener<MyEvent> {  
  
    @Override  
    public void onApplicationEvent(MyEvent event) {  
        // 处理事件  
    }  
}  
  
// 在某处发布事件  
applicationContext.publishEvent(new MyEvent(/*...*/));
相关推荐
学Linux的语莫18 分钟前
机器学习数据处理
java·算法·机器学习
找不到、了18 分钟前
JVM的即时编译JIT的介绍
java·jvm
rongqing201936 分钟前
Google 智能体设计模式:人机协同(HITL)
设计模式
西瓜er1 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .1 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮1 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀1 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
Javatutouhouduan1 小时前
Java程序员如何深入学习JVM底层原理?
java·jvm·java面试·后端开发·java架构师·java程序员·互联网大厂
王嘉俊9252 小时前
设计模式--享元模式:优化内存使用的轻量级设计
java·设计模式·享元模式
2301_803554522 小时前
C++联合体(Union)详解:与结构体的区别、联系与深度解析
java·c++·算法