最新国产好看的视频,伊人天堂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)過程中,廣泛運(yùn)用了多種設(shè)計(jì)模式,這些設(shè)計(jì)模式幫助 Spring 實(shí)現(xiàn)了高內(nèi)聚、低耦合、可擴(kuò)展和易維護(hù)的架構(gòu)。

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

1. 工廠模式(Factory Pattern)

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

Spring 中的體現(xiàn)

BeanFactory ApplicationContext

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

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

FactoryBean

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

2. 單例模式(Singleton Pattern)

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

Spring 中的體現(xiàn)

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

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

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

3. 代理模式(Proxy Pattern)

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

Spring 中的體現(xiàn)

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

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

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

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

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

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

Spring 中的體現(xiàn)

  • 數(shù)據(jù)庫操作模板(JdbcTemplateRedisTemplate 等)
  • JdbcTemplate 為例,它封裝了 JDBC 的固定流程(獲取連接、創(chuàng)建語句、執(zhí)行 SQL、關(guān)閉資源),而 SQL 執(zhí)行邏輯(可變部分)由開發(fā)者通過回調(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 對象(自定義邏輯)
        return new User(rs.getLong("id"), rs.getString("name"));
    }
});

5. 觀察者模式(Observer Pattern)

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

Spring 中的體現(xiàn)

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

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

示例:

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

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

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

6. 適配器模式(Adapter Pattern)

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

Spring 中的體現(xiàn)

HandlerAdapter(Spring MVC 中)

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

示例:

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

7. 裝飾者模式(Decorator Pattern)

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

Spring 中的體現(xiàn)

BeanWrapper 對 Bean 的增強(qiáng)

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

HttpServletRequestWrapper(Spring Web 中)

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

8. 策略模式(Strategy Pattern)

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

Spring 中的體現(xiàn)

資源加載策略(ResourceLoader

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

示例:

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

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

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

  • 解耦與靈活:工廠模式、代理模式、適配器模式讓組件可插拔、易擴(kuò)展;
  • 高效與簡潔:模板方法模式、單例模式減少重復(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注解需要注意的問題

    spring中@value注解需要注意的問題

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

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

    本文主要介紹了java多線程實(shí)現(xiàn)同步鎖賣票實(shí)戰(zhàn)項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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í)_動力節(jié)點(diǎn)Java學(xué)院整理

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

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

    淺談log4j 不打印異常堆棧

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

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

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

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

    這篇文章主要介紹了mybatis如何處理返回結(jié)果集問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    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)者無法快速消費(fèi)的問題。這個(gè)時(shí)候需要一個(gè)中間層,保存這個(gè)數(shù)據(jù),rabbitMQ是一個(gè)很好的解決方案
    2022-12-12
  • 解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯誤的問題

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

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

最新評論

沽源县| 安康市| 铁岭县| 文昌市| 吉水县| 同江市| 凤冈县| 鲁山县| 沂水县| 南宁市| 祁连县| 娱乐| 六盘水市| 上饶县| 太原市| 大方县| 温州市| 囊谦县| 嘉兴市| 陇西县| 太和县| 新兴县| 镇雄县| 延吉市| 巴东县| 武强县| 香河县| 丰镇市| 绥中县| 辉南县| 健康| 湟中县| 普定县| 弥渡县| 广汉市| 鲜城| 台南市| 天等县| 六安市| 塘沽区| 乌兰察布市|