Spring簡介-IOC

来源:https://www.cnblogs.com/zhongjianYuan/archive/2023/03/09/17201695.html
-Advertisement-
Play Games

1、Spring 1.1、簡介 Spring:春天 >給軟體行業帶來了春天! 2002,首次推出了Spring框架的雛形:interf21框架! Spring框架即以interface21框架為基礎,經過重新設計,並不斷豐富其內涵,於2004年3月24日發佈了1.0正式版。 Rod Johnson ...


目錄

1、Spring


1.1、簡介

  • Spring:春天----------->給軟體行業帶來了春天!

  • 2002,首次推出了Spring框架的雛形:interf21框架!

  • Spring框架即以interface21框架為基礎,經過重新設計,並不斷豐富其內涵,於2004年3月24日發佈了1.0正式版。

  • Rod Johnson ,Spring Framework創始人,悉尼大學音樂學博士,電腦學位

  • Spring理念:使現有的技術更加容易使用,本身就是一個大雜燴,整合了現有的技術框架!

  • SSH: Struct2+Spring +Hibernate!

  • SSM: SpringMvc+Spring+Mybatis!

官網:Spring Framework

官網下載地址:repo.spring.io

GitHub:GitHub - spring-projects/spring-framework: Spring Framework

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

ctrl+shift+o 導入

1.2、優點

  • Spring使一個開源的免費的框架(容器)!

  • Spring使一個輕量級的、非入侵式的框架!

  • 控制反轉(IOC),面向切麵編程(AOP)!

  • 支持事務的處理,對框架整合的支持!

總結一句話:Springjiushi+一個輕量級的控制反轉(IOC)和麵向切麵編程的框架!

1.3、組成

1.4、擴展

在Spring的官網有這個介紹:現代化的java開發!說白就是基於Spring的開發!

  • Spring Boot
    • 一個快速開發的腳手架
    • 基於SpingBoot可以快速的開發單個微服務
    • 約定大於配置!
  • Spring Cloud
    • SpringCloud式基於SpringBoot實現的

因為現在大多數公司都在使用SpringBoot進行快速開發,學習SpringBoot的前提,需要完全掌握Spring以及SpringMVC!承上啟下的作用!

弊端:發展了太久之後,違背了原來的理念!配置十分繁瑣,人稱“ 配置地獄!”

2、IOC理論推導


  1. UserDao介面

    package com.jan.dao;
    
    public interface UserDao {
        void getUser();
    }
    
    
  2. UserDaoImpl實現類

    package com.jan.dao;
    
    public class UserDaoImpl implements UserDao{
    
        public void getUser() {
            System.out.println("預設獲取用戶的數據!");
        }
    }
    
    
  3. UserService 業務介面

    package com.jan.dao.service;
    
    public interface UserService {
        void getUser();
    }
    
    
  4. UserService Impl 業務實現類

    package com.jan.dao.service;
    
    import com.jan.dao.UserDao;
    import com.jan.dao.UserDaoImpl;
    import com.jan.dao.UserDaoMysqlImpl;
    import com.jan.dao.UserDaoOracleImpl;
    
    public class UserServiceImpl implements UserService{
    
        //增加了 UserDaoMysqlImpl 類,就必須來改變  UserServiceImpl 類 裡面的源代碼,
        //如是很多類不得累死?解決的辦法?
        //private UserDao userDao = new UserDaoImpl();//對象寫死了
       // private UserDao userDao = new UserDaoMysqlImpl();//對象寫死了
       // private UserDao userDao = new UserDaoOracleImpl();//對象寫死了
    
        private UserDao userDao;
    
        //利用set動態實現值的註入!!
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void getUser() {
            userDao.getUser();
        }
    }
    
    
  5. 若是有其他新增加的Impl類

    package com.jan.dao;
    
    public class UserDaoMysqlImpl implements UserDao{
        public void getUser() {
            System.out.println("Mysql獲取用戶數據!");
        }
    }
    
    
  6. MyTest的實現

    import com.jan.dao.UserDaoSqlserverImpl;
    import com.jan.dao.service.UserService;
    import com.jan.dao.service.UserServiceImpl;
    
    public class MyTest {
        public static void main(String[] args) {
    
            //用戶實際調用的是業務層,dao層它們不需要接觸!
            UserService userService = new UserServiceImpl();
    
            ((UserServiceImpl) userService).setUserDao(new UserDaoSqlserverImpl());
    
            userService.getUser();
        }
    }
    
    

在我們之前的業務中,用戶的需求可能會影響我們原來的代碼,我們需要根據用戶的需求去修改原代碼!如果程式代碼量十分大,修改一次的成本代價十分昂貴!

我們使用了一個Set介面實現,已經發生了革命性的變化!

 private UserDao userDao;

//利用set動態實現值的註入!!
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
  • 之前,程式是主動創建對象!控制權在程式猿手上!

    private UserDao userDao = new 8UserDaoMysqlImpl();//對象寫死了
    
  • 使用set註入後,程式不再具有主動性,而是成了被動的接受對象!

這種思想,從本質上解決了問題,我們程式猿不用再去管理對象的創建了。系統的耦合性大大降低了,可以更加專註的在業務的實現上!這是IOC的原型!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 減少記憶體使用 1.1. 減少堆記憶體的使用 1.1.1. 使用更少的記憶體意味著堆被填滿的頻率會降低,需要的GC周期會更少,其效果也可以成倍增強 1.1.2. 更少的新生代回收意味著對象的晉升年齡增加的頻率降低 1.1.3. 對象晉升到老年代的可能性也降低了 1.1.4. Full GC周期(或者 ...
  • Qt 學習筆記全系列傳送門: Qt 學習筆記 - 第一章 - 快速開始、信號與槽 Qt 學習筆記 - 第二章 - 添加圖片、佈局、界面切換 【本章】Qt 學習筆記 - 第三章 - Qt的三駕馬車之一 - 串口編程 + 程式打包成Windows軟體 1、創建項目 實現串口助手 創建 Qt Widget ...
  • find,grep,sed,awk find:常用在目錄下精確查找文件(最擅長找文件) grep:常用來做全局數據的查詢定位(最擅長文本過濾) sed:常用來做行數據增刪改查(最擅長取行) awk:常用來做列數據切分與提取(最擅長取列) 1.find【擅長在目錄下找文件】 find 命令用來在指定目 ...
  • 先看如下一個DEMO示例代碼:(其中doBatchGet被子類重寫了1次) public abstract class BaseDemoService<T> { public String batchGet(T... ints) { T one=ints[0]; System.out.println ...
  • 前置知識: Web 伺服器:可以指硬體上的,也可以指軟體上的。從硬體的角度來說, Web 伺服器指的就是一臺存儲了網路服務軟體的電腦;從軟體的角度來說, Web 伺服器指的是一種軟體,比如 Tomcat。 Servlet 容器:目前主流的 Servlet 容器軟體包括 Tomcat、Jetty、J... ...
  • SpringBoot Controller 控制器 SpringBoot提供了@Controller和@RestController兩種註解來標識此類負責接收和處理HTTP請求。 如果請求的是頁面和數據,使用@Controller註解即可;如果只是請求數據,則可以使用@RestController註 ...
  • 1.學習目標 2.簡介 技術論壇:http://bbs.chinaunix.net/forum-240-1.html 資源地址:https://sourceforge.net/projects/fastdfs/ 源碼地址:https://github.com/happyfish100 FastDFS ...
  • 前言 對於大多數 maven 多模塊化工程,可以使用 Jacoco 這款工具,關於 Jacoco 這款工具,ChatGPT 對它的描述是這樣的: JaCoCo(Java Code Coverage)是一個開源的測試覆蓋率工具,它可以用於幫助開發人員衡量其軟體測試的有效性。它支持多種語言,包括 Jav ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...