最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring框架運(yùn)用了多種設(shè)計(jì)模式方式

 更新時(shí)間:2025年08月29日 08:55:18   作者:dj_master  
Spring框架廣泛采用設(shè)計(jì)模式,如工廠模式(BeanFactory)、單例模式、代理模式(AOP)、模板方法模式(JdbcTemplate)等,以實(shí)現(xiàn)高內(nèi)聚、低耦合、可擴(kuò)展和易維護(hù)的架構(gòu),支撐IoC、AOP和MVC等核心特性

Spring 框架在設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中,廣泛運(yùn)用了多種設(shè)計(jì)模式,這些設(shè)計(jì)模式幫助 Spring 實(shí)現(xiàn)了高內(nèi)聚、低耦合、可擴(kuò)展和易維護(hù)的架構(gòu)。

以下詳細(xì)介紹 Spring 中常用的設(shè)計(jì)模式及其應(yīng)用場(chǎng)景:

1. 工廠模式(Factory Pattern)

作用:封裝對(duì)象創(chuàng)建的邏輯,解耦對(duì)象的創(chuàng)建和使用,讓代碼更靈活、可維護(hù)。

Spring 中的體現(xiàn)

BeanFactory ApplicationContext

它們是工廠模式的典型實(shí)現(xiàn),負(fù)責(zé)創(chuàng)建和管理 Bean。

  • BeanFactory 是基礎(chǔ)工廠接口,提供最基本的 Bean 創(chuàng)建、查找功能;
  • ApplicationContext 是更高級(jí)的工廠(繼承 BeanFactory),還支持 AOP、國(guó)際化、事件發(fā)布等功能。
  • 示例:通過(guò) applicationContext.getBean("userService") 獲取 Bean,無(wú)需關(guān)心 UserService 如何實(shí)例化(構(gòu)造器、工廠方法等)。

FactoryBean

  • 是一種“工廠 Bean”,允許自定義 Bean 的創(chuàng)建邏輯。
  • 比如整合第三方框架(如 MyBatis 的 SqlSessionFactoryBean)時(shí),FactoryBean 可以封裝復(fù)雜的創(chuàng)建過(guò)程,讓框架無(wú)縫接入 Spring。

2. 單例模式(Singleton Pattern)

作用:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn),節(jié)省資源、保證狀態(tài)一致。

Spring 中的體現(xiàn)

默認(rèn) Bean 作用域(singleton

Spring 容器中,默認(rèn)情況下每個(gè) Bean 的作用域是單例(除非顯式配置 prototype 或其他作用域)。

  • 實(shí)現(xiàn):通過(guò) DefaultSingletonBeanRegistry 維護(hù)一個(gè)單例緩存(singletonObjects),確保 Bean 全局唯一。
  • 示例:@Service 標(biāo)注的服務(wù)類(lèi),整個(gè)應(yīng)用中只有一個(gè)實(shí)例,避免重復(fù)創(chuàng)建開(kāi)銷(xiāo)。

3. 代理模式(Proxy Pattern)

作用:通過(guò)代理對(duì)象增強(qiáng)目標(biāo)對(duì)象的功能(如權(quán)限控制、日志、事務(wù)),且不修改目標(biāo)對(duì)象代碼。

Spring 中的體現(xiàn)

AOP 實(shí)現(xiàn)

Spring AOP 基于動(dòng)態(tài)代理,有兩種方式:

  • JDK 動(dòng)態(tài)代理:針對(duì)實(shí)現(xiàn)接口的類(lèi),通過(guò) java.lang.reflect.Proxy 創(chuàng)建代理對(duì)象,增強(qiáng)接口方法。
  • CGLIB 動(dòng)態(tài)代理:針對(duì)未實(shí)現(xiàn)接口的類(lèi),通過(guò)繼承目標(biāo)類(lèi)創(chuàng)建代理對(duì)象(重寫(xiě)方法實(shí)現(xiàn)增強(qiáng))。

示例:@Transactional 注解的事務(wù)管理,就是通過(guò)代理對(duì)象在方法調(diào)用前后織入事務(wù)邏輯。

4. 模板方法模式(Template Method Pattern)

作用:定義算法的骨架,將可變部分延遲到子類(lèi)實(shí)現(xiàn),減少重復(fù)代碼。

Spring 中的體現(xiàn)

  • 數(shù)據(jù)庫(kù)操作模板(JdbcTemplate、RedisTemplate 等)
  • JdbcTemplate 為例,它封裝了 JDBC 的固定流程(獲取連接、創(chuàng)建語(yǔ)句、執(zhí)行 SQL、關(guān)閉資源),而 SQL 執(zhí)行邏輯(可變部分)由開(kāi)發(fā)者通過(guò)回調(diào)(RowMapper)實(shí)現(xiàn)。

示例:

List<User> users = jdbcTemplate.query("SELECT * FROM user", new RowMapper<User>() {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        // 映射結(jié)果集到 User 對(duì)象(自定義邏輯)
        return new User(rs.getLong("id"), rs.getString("name"));
    }
});

5. 觀察者模式(Observer Pattern)

作用:定義對(duì)象間的一對(duì)多依賴(lài),當(dāng)一個(gè)對(duì)象狀態(tài)變化時(shí),通知所有依賴(lài)對(duì)象自動(dòng)更新。

Spring 中的體現(xiàn)

事件驅(qū)動(dòng)模型(ApplicationEvent ApplicationListener

  • 發(fā)布者通過(guò) ApplicationEventPublisher 發(fā)布事件(如 ContextRefreshedEvent 表示容器初始化完成);
  • 監(jiān)聽(tīng)者實(shí)現(xiàn) ApplicationListener 接口,訂閱感興趣的事件,事件發(fā)生時(shí)觸發(fā) onApplicationEvent 方法。

示例:

// 自定義事件
public class UserRegisteredEvent extends ApplicationEvent {
    public UserRegisteredEvent(User user) {
        super(user);
    }
}

// 監(jiān)聽(tīng)者
@Component
public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> {
    @Override
    public void onApplicationEvent(UserRegisteredEvent event) {
        User user = (User) event.getSource();
        // 發(fā)送注冊(cè)通知(如郵件、短信)
    }
}

// 發(fā)布事件
@Service
public class UserService {
    @Autowired private ApplicationEventPublisher publisher;
    public void register(User user) {
        // 注冊(cè)邏輯...
        publisher.publishEvent(new UserRegisteredEvent(user));
    }
}

6. 適配器模式(Adapter Pattern)

作用:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶端期望的另一種接口,使原本不兼容的類(lèi)可以協(xié)作。

Spring 中的體現(xiàn)

HandlerAdapter(Spring MVC 中)

DispatcherServlet 需要調(diào)用不同類(lèi)型的 Controller(如注解驅(qū)動(dòng)的 @Controller、古老的 Controller 接口),HandlerAdapter 作為適配器,統(tǒng)一調(diào)用方式。

示例:

  • SimpleControllerHandlerAdapter 適配實(shí)現(xiàn) Controller 接口的類(lèi);
  • RequestMappingHandlerAdapter 適配 @Controller + @RequestMapping 注解的類(lèi)。
  • 這樣 DispatcherServlet 只需調(diào)用 handlerAdapter.handle(...),無(wú)需關(guān)心具體 Controller 類(lèi)型。

7. 裝飾者模式(Decorator Pattern)

作用:動(dòng)態(tài)地給對(duì)象添加額外職責(zé),比繼承更靈活(避免子類(lèi)爆炸)。

Spring 中的體現(xiàn)

BeanWrapper 對(duì) Bean 的增強(qiáng)

  • BeanWrapper 封裝了 Bean 對(duì)象,并提供類(lèi)型轉(zhuǎn)換、屬性訪問(wèn)等增強(qiáng)功能。
  • 比如在屬性注入時(shí),BeanWrapper 會(huì)自動(dòng)將配置文件中的字符串轉(zhuǎn)換為 Bean 的屬性類(lèi)型(如把 "18" 轉(zhuǎn)為 Integer)。

HttpServletRequestWrapper(Spring Web 中)

  • 用于包裝 HttpServletRequest,動(dòng)態(tài)添加功能(如修改請(qǐng)求參數(shù)、頭信息)。

8. 策略模式(Strategy Pattern)

作用:定義一系列算法,將每個(gè)算法封裝成策略類(lèi),運(yùn)行時(shí)動(dòng)態(tài)選擇策略。

Spring 中的體現(xiàn)

資源加載策略(ResourceLoader

Spring 支持多種資源加載方式(如類(lèi)路徑、文件系統(tǒng)、URL),ResourceLoader 通過(guò) Resource 接口的不同實(shí)現(xiàn)(ClassPathResource、FileSystemResource 等),動(dòng)態(tài)選擇加載策略。

示例:

Resource resource = resourceLoader.getResource("classpath:config.properties");
// 根據(jù)路徑前綴(classpath:、file: 等)自動(dòng)選擇策略加載資源

總結(jié):Spring 設(shè)計(jì)模式的價(jià)值

這些設(shè)計(jì)模式不是孤立的,而是相互配合,共同支撐 Spring 的核心特性(如 IoC、AOP、MVC):

  • 解耦與靈活:工廠模式、代理模式、適配器模式讓組件可插拔、易擴(kuò)展;
  • 高效與簡(jiǎn)潔:模板方法模式、單例模式減少重復(fù)代碼,提升性能;
  • 可維護(hù)與可擴(kuò)展:觀察者模式、策略模式讓框架具備高內(nèi)聚、低耦合的架構(gòu)。

理解這些設(shè)計(jì)模式,不僅能更好地使用 Spring,還能學(xué)習(xí)框架設(shè)計(jì)的思路,應(yīng)用到自己的代碼中。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring中@value注解需要注意的問(wèn)題

    spring中@value注解需要注意的問(wèn)題

    本篇文章主要介紹了spring中@value注解需要注意的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • java多線程實(shí)現(xiàn)同步鎖賣(mài)票實(shí)戰(zhàn)項(xiàng)目

    java多線程實(shí)現(xiàn)同步鎖賣(mài)票實(shí)戰(zhàn)項(xiàng)目

    本文主要介紹了java多線程實(shí)現(xiàn)同步鎖賣(mài)票實(shí)戰(zhàn)項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java ExecutorService CompletionService線程池區(qū)別與選擇

    java ExecutorService CompletionService線程池區(qū)別與選擇

    這篇文章主要為大家介紹了java ExecutorService CompletionService線程池區(qū)別與選擇使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Filter、Servlet、Listener的學(xué)習(xí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Filter、Servlet、Listener的學(xué)習(xí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Filter、Servlet、Listener的學(xué)習(xí)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 淺談log4j 不打印異常堆棧

    淺談log4j 不打印異常堆棧

    這篇文章主要介紹了淺談log4j 不打印異常堆棧,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題

    解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題

    這篇文章主要介紹了解決Mybatis-Plus操作分頁(yè)后數(shù)據(jù)失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • mybatis如何處理返回結(jié)果集

    mybatis如何處理返回結(jié)果集

    這篇文章主要介紹了mybatis如何處理返回結(jié)果集問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java集合繼承關(guān)系圖分享

    java集合繼承關(guān)系圖分享

    這篇文章主要為大家詳細(xì)介紹了java集合繼承關(guān)系圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Rabbitmq消息推送功能實(shí)現(xiàn)示例

    Rabbitmq消息推送功能實(shí)現(xiàn)示例

    rabbitMQ為異步消息處理提出了一個(gè)很好的解決方案,它是一個(gè)非常好用的消息中間件。主要解決當(dāng)生產(chǎn)者大量產(chǎn)生數(shù)據(jù)時(shí),消費(fèi)者無(wú)法快速消費(fèi)的問(wèn)題。這個(gè)時(shí)候需要一個(gè)中間層,保存這個(gè)數(shù)據(jù),rabbitMQ是一個(gè)很好的解決方案
    2022-12-12
  • 解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題

    解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

黄冈市| 恩平市| 金乡县| 万载县| 灵石县| 广宗县| 清原| 宁晋县| 景谷| 栾城县| 邹平县| 罗山县| 北安市| 藁城市| 昭觉县| 磐安县| 邢台县| 澄江县| 沅江市| 从化市| 吕梁市| 平和县| 衡东县| 博罗县| 无锡市| 双江| 乐业县| 南通市| 德钦县| 固镇县| 霍林郭勒市| 京山县| 永清县| 扬州市| 囊谦县| 拜泉县| 高阳县| 嘉定区| 龙山县| 呈贡县| 瑞昌市|