????????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 應用:
-
JdbcTemplate
、RestTemplate
?等模板類封裝了資源管理(如連接、異常處理),用戶只需實現回調。
-
-
示例:
public class JdbcTemplateExample {@Autowiredprivate 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> {@Overridepublic void onApplicationEvent(CustomEvent event) {// 處理事件} }// 發布事件 applicationContext.publishEvent(new CustomEvent(this));
7.?策略模式(Strategy Pattern)?
-
定義:定義一系列的算法,把它們一個個封裝起來,并使它們可互換。
-
在 Spring 中的應用:
-
資源加載:
Resource
?接口的不同實現(ClassPathResource
、UrlResource
)。 -
事務管理:支持多種事務策略(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);}@Overridepublic 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();