Spring 是基础框架,Spring Boot 则是对 Spring 的自动配置和工程整合。所以这些设计模式大多数 Spring 和 Spring Boot 都会用到,只是 Spring Boot 更倾向于简化配置和增强自动化能力。
工厂模式(Factory Pattern)
说明:
用于封装对象创建过程,隐藏实现细节。
应用场景:
Spring 的 BeanFactory、ApplicationContext 用于创建 Bean。
示例:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);
单例模式(Singleton Pattern)
说明:
只创建一个实例,提升资源利用率。
应用场景:
Spring 默认所有 Bean 都是单例的。
示例:
@Component
public class SingletonBean {
public SingletonBean() {
System.out.println("创建了一个实例");
}
}
多次 @Autowired 注入只会创建一个对象。
代理模式(Proxy Pattern)
说明:
给目标对象附加额外功能(如事务、日志)而不改变原对象。
应用场景:
Spring AOP 实现:事务、日志、权限控制。
示例:
@Transactional
public void saveUser(User user) {
userRepository.save(user);
}
Spring 通过 JDK/CGLIB 动态代理为 saveUser 方法增强。
模板方法模式(Template Method Pattern)
说明:
定义算法骨架,一些步骤延迟到子类中实现。
应用场景:
JdbcTemplate、RestTemplate、RedisTemplate。
示例:
jdbcTemplate.query("SELECT * FROM user", new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
return new User(rs.getInt("id"), rs.getString("name"));
}
});
其中 query() 是固定流程,具体如何映射交给开发者提供的 RowMapper。
观察者模式(Observer Pattern)
说明:
一个对象状态改变,其他观察者自动收到通知。
应用场景:
Spring 的事件监听机制。
示例:
// 定义事件
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) { super(source); }
}
// 发布事件
applicationContext.publishEvent(new MyEvent("发布自定义事件"));
// 监听事件
@Component
public class MyListener {
@EventListener
public void handleEvent(MyEvent event) {
System.out.println("监听到事件: " + event.getSource());
}
}
策略模式(Strategy Pattern)
说明:
在运行时选择不同算法或行为。
应用场景:
比如登录有短信、邮箱、微信三种方式。
示例:
public interface LoginStrategy { void login(String userInfo); }
@Component("sms")
public class SmsLogin implements LoginStrategy { ... }
@Component("email")
public class EmailLogin implements LoginStrategy { ... }
@Service
public class LoginService {
@Autowired private Map<String, LoginStrategy> strategyMap;
public void doLogin(String type, String userInfo) {
strategyMap.get(type).login(userInfo);
}
}
适配器模式(Adapter Pattern)
说明:
不同接口之间适配,互相兼容。
应用场景:
HandlerAdapter 适配不同类型的控制器(@Controller, HttpRequestHandler, Controller 等)。
示例(Spring MVC 内部逻辑):
if (handler instanceof Controller) {
return new SimpleControllerHandlerAdapter();
}
责任链模式(Chain of Responsibility Pattern)
说明:
请求沿着链路传递,每个处理器决定是否处理。
应用场景:
Spring MVC 的 Filter、Interceptor。
示例:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 登录拦截器
return isLogin();
}
装饰器模式(Decorator Pattern)
说明:
不修改对象结构的情况下增加额外功能。
应用场景:
Spring AOP、对 Bean 的包装。
示例(自定义缓存):
@Around("@annotation(Cacheable)")
public Object cache(ProceedingJoinPoint joinPoint) throws Throwable {
String key = generateKey(joinPoint);
if (cache.containsKey(key)) return cache.get(key);
Object result = joinPoint.proceed();
cache.put(key, result);
return result;
}
建造者模式(Builder Pattern)
说明:
构建复杂对象,通过链式配置。
应用场景:
SpringApplicationBuilder、RestTemplateBuilder。
示例:
new SpringApplicationBuilder(MyApplication.class)
.profiles("dev")
.run(args);
桥接模式(Bridge Pattern)
说明:
将抽象部分和实现部分分离。
应用场景:
Spring 消息子系统(AbstractMessageSender 和不同实现)。
示例:
Spring 的 JdbcTemplate 与 DataSource 解耦。
原型模式(Prototype Pattern)
说明:
每次创建一个新的实例。
应用场景:
@Scope(“prototype”) 用于非线程安全、每次都要新对象的场景。
示例:
@Component
@Scope("prototype")
public class MyPrototypeBean { }
组合模式(Composite Pattern)
说明:
将对象组合成树形结构以表示“部分-整体”的层次结构。
应用场景:
Spring Security 的权限体系、配置组合。
示例:
多个 WebSecurityConfigurerAdapter 合并规则配置。
中介者模式(Mediator Pattern)
说明:
通过中介对象统一管理多个对象之间的交互,避免对象之间直接引用。
应用场景:
ApplicationContext 作为 Bean 之间的中介,协调调用。
示例:
@Component
public class OrderService {
@Autowired private ApplicationEventPublisher publisher;
public void createOrder() {
publisher.publishEvent(new OrderCreatedEvent(this));
}
}