关于Spring中用到的设计模式

发布于:2025-06-19 ⋅ 阅读:(12) ⋅ 点赞:(0)

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));
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到