Spring框架是一个广泛用于构建Java企业级应用的开源框架,它提供了丰富的功能和模块,同时支持多种设计模式。以下是一些在Spring框架中常见的设计模式
1 单例模式(Singleton Pattern)
- Spring的IoC容器默认情况下会创建单例的Bean,确保在应用中只有一个实例。
- 通过在Spring配置文件中配置bean的
scope
属性为"singleton"
<bean id="exampleBean" class="com.example.ExampleBean" scope="singleton"/>
或使用
@Scope("singleton")
注解来实现。
@Component
@Scope("singleton")
public class MyBean {
// 类定义
}
1.1 容器管理的单例
- Spring框架本身也采用了单例模式。例如,
ApplicationContext
是一个单例对象,负责管理整个应用程序的Bean。- 在应用程序的上下文中,只有一个
ApplicationContext
实例。
1.2 线程安全考虑
- 单例模式在多线程环境中可能涉及到线程安全问题。在默认的懒汉式单例模式中,如果多个线程同时访问,可能会导致创建多个实例。
- 可以使用双重检查锁定或者使用
volatile
关键字来保证线程安全。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
// 初始化操作
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
1.3 使用场景
- 单例模式适用于那些需要在整个应用程序中共享状态或资源的情况,以及需要频繁创建和销毁实例开销较大的情况。
- 例如,数据库连接池、线程池、配置管理器等可以使用单例模式
1.4 Spring Bean的生命周期
- Spring容器在启动时会创建并初始化所有单例Bean,这保证了它们在应用程序的生命周期内一直存在。
- 单例Bean的生命周期包括实例化、属性注入、初始化和销毁阶段。
在Spring中,默认使用单例模式的Bean适合那些状态无关且无需频繁创建销毁的组件。如果某个Bean需要保持状态,或者需要频繁创建和销毁,可以考虑使用其他作用域,如原型(prototype)或会话(session)。通过选择合适的Bean作用域,可以更好地满足应用程序的需求。
2 原型模式(Prototype Pattern):
- 与单例模式相对,原型模式在每次请求时创建一个新的实例。
- 在Spring中,可以通过在配置文件中将
scope
属性设置为"prototype",或使用@Scope("prototype")
注解来实现。
<bean id="exampleBean" class="com.example.ExampleBean" scope="prototype"/>
3 工厂模式(Factory Pattern):
- Spring中的Bean工厂负责创建和管理Bean实例。
- 可以通过XML配置文件中的
<bean>
元素或使用注解来声明Bean。- BeanFactory就是工厂模式的体现。Spring使用工厂模式可以通过
BeanFactory
或ApplicationContext
创建 bean 对象。
<bean id="exampleBean" class="com.example.ExampleBean"/>
4 代理模式(Proxy Pattern):
- Spring AOP(面向切面编程)基于代理模式,通过代理对象实现横切关注点的模块化。
- Spring提供了两种代理方式:JDK动态代理和CGLIB代理。
// JDK动态代理
SomeInterface proxy = (SomeInterface) Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class[]{SomeInterface.class},
new MyInvocationHandler());
// CGLIB代理
SomeClass proxy = (SomeClass) Enhancer.create(SomeClass.class, new MyMethodInterceptor());
5 观察者模式(Observer Pattern):
Spring事件机制基于观察者模式,允许对象在状态发生变化时通知依赖它的对象。
// 发布事件
applicationContext.publishEvent(new MyCustomEvent(this, eventData));
// 监听事件
@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
@Override
public void onApplicationEvent(MyCustomEvent event) {
// 处理事件
}
}
6 模板模式(Template Method Pattern):
Spring的JdbcTemplate就是一个典型的模板模式的应用,定义了执行SQL语句的基本流程,而具体的实现由子类提供。
public abstract class JdbcTemplate {
public final void execute(String sql) {
// 公共逻辑
// 子类实现的特定逻辑
executeSql(sql);
// 公共逻辑
}
protected abstract void executeSql(String sql);
}
7 策略模式(Strategy Pattern):
Spring的
@Autowired
注解可以被视为一种策略模式的应用,根据不同的策略(实现类),自动注入相应的实例。
@Component
public class SomeService {
@Autowired
private SomeStrategy strategy;
}
public interface SomeStrategy {
void execute();
}
@Component
public class ConcreteStrategy1 implements SomeStrategy {
// 实现策略
}
@Component
public class ConcreteStrategy2 implements SomeStrategy {
// 实现策略
}