主頁 > 後端開發 > 程式員必須掌握的Java 框架,小白學會之后15k不是問題

程式員必須掌握的Java 框架,小白學會之后15k不是問題

2020-10-07 02:39:48 後端開發

Spring 的核心特性是什么?Spring 優點?

Spring 的核心是控制反轉(IoC)和面向切面(AOP)

Spring 優點:
在這里插入圖片描述
程式員必須掌握的Java 框架,學會之后50k不是問題
(1)方便解耦,簡化開發 (高內聚低耦合)

Spring 就是一個大工廠(容器),可以將所有物件創建和依賴關系維護,交給 Spring管理

spring 工廠是用于生成 bean

(2)AOP 編程的支持

Spring 提供面向切面編程,可以方便的實作對程式進行權限攔截、運行監控等功能

(3) 宣告式事務的支持

只需要通過配置就可以完成對事務的管理,而無需手動編程

(4) 方便程式的測驗

Spring 對 Junit4 支持,可以通過注解方便的測驗 Spring 程式

(5)方便集成各種優秀框架

Spring 不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持

(6) 降低 JavaEE API 的使用難度

Spring 對 JavaEE 開發中非常難用的一些 API(JDBC、JavaMail、遠程呼叫等),都提供了封裝,使這些 API 應用難度大大降低

spring 框架中需要參考哪些 jar 包,以及這些 jar 包的用途

4 + 1 : 4 個 核 心 ( beans 、 core 、 context 、 expression ) + 1 個 依 賴(commons-loggins…jar)

理解 AOP、IoC 的基本原理;

IOC:控制反轉(IoC)與依賴注入(DI)是同一個概念,

控制反轉的思想:

傳統的 java 開發模式中,當需要一個物件時,我們會自己使用 new 或者getInstance 等直接或者間接呼叫構造方法創建一個物件,而在 spring 開發模式中,spring 容器使用了工廠模式為我們創建了所需要的物件,不需要我們自己創建了,直接呼叫 spring 提供的物件就可以了

引入 IOC 的目的:

(1)脫開、降低類之間的耦合;(2)倡導面向介面編程、實施依賴倒換原則;

(3)提高系統可插入、可測驗、可修改等特性

AOP:面向切面編程(AOP)面向切面編程思想:

在面向物件編程(oop)思想中,我們將事物縱向抽成一個個的物件,而在面向切面編程中,我們將一個個的物件某些類似的方面橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日志等公用操作處理的程序,

切面:簡單說就是那些與業務無關,卻為業務模塊所共同呼叫的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護性,

AOP 底層:動態代理,

如果是介面采用 JDK 動態代理,如果是類采用 CGLIB 方式實作動態代理,

AOP 的一些場景應用;

AOP 用來封裝橫切關注點,具體可以在下面的場景中使用:

Authentication 權限

Caching 快取

Context passing 內容傳遞

Error handling 錯誤處理

Lazy loading 懶加載

Debugging除錯

logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準

Performance optimization 性能優化

Persistence持久化

Resource pooling 資源池

Synchronization 同步

Transactions 事務

spring 注入的幾種方式
(1)構造方法注入

(2)setter 注入

(3)基于注解

Spring 中 Bean 的作用域有哪些

作用域:用于確定 spring 創建 bean 實體個數

取值(常用的兩個):

singleton 單例,默認值,prototype 多例,一個 bean 的定義可以有多個實體,每執行一次 getBean 將獲得一個實體,

請介紹一下 bean 的生命周期

(1)bean 定義:在組態檔里面用來進行定義,

(2)bean 初始化:有兩種方式初始化:在組態檔中通過指定 init-method 屬性來完成實作
org.springframwork.beans.factory.InitializingBean 介面

(3)bean 呼叫:有三種方式可以得到 bean 實體,并進行呼叫

(4)bean 銷毀:銷毀有兩種方式使用組態檔指定的 destroy-method 屬性實作
org.springframwork.bean.factory.DisposeableBean 介面

Spring 中自動裝配的方式有哪些

no:不進行自動裝配,手動設定 Bean 的依賴關系,
在這里插入圖片描述
byName:根據 Bean 的名字進行自動裝配,

byType:根據 Bean 的型別進行自動裝配,

constructor:類似于 byType,不過是應用于構造器的引數,如果正好有一個 Bean與構造器的引數型別相同則可以自動裝配,否則會導致錯誤,autodetect:如果有默認的構造器,則通過 constructor 的方式進行自動裝配,否則使用 byType 的方式進行自動裝配,

(自動裝配沒有自定義裝配方式那么精確,而且不能自動裝配簡單屬性(基本型別、字串等),在使用時應注意,)

@Resource 和 @Autowired 區別?分別用在什么場景?

(1)共同點:兩者都可以寫在欄位和 setter 方法上,兩者如果都寫在欄位上,那么就不需要再寫 setter 方法,

(2)不同點:

@Autowired

@Autowired為Spring提供的注解,需要匯入包
org.springframework.beans.factory.annotation.Autowired;只按照 byType 注入,@Autowired 注解是按照型別(byType)裝配依賴物件,默認情況下它要求依賴物件必須存在,如果允許 null 值,可以設定它的 required 屬性為 false,如果我們想使用按照名稱(byName)來裝配,可以結合@Qualifier 注解一起使用,

@Resource

@Resource 默 認 按 照 ByName 自 動 注 入 , 由 J2EE 提 供 , 需 要 導 入 包javax.annotation.Resource,@Resource 有兩個重要的屬性:name 和 type,而 Spring將@Resource 注解的 name 屬性決議為 bean 的名字,而 type 屬性則決議為 bean的型別,所以,如果使用 name 屬性,則使用 byName 的自動注入策略,而使用type 屬性時則使用 byType 自動注入策略,如果既不制定 name 也不制定 type 屬性,這時將通過反射機制使用 byName 自動注入策略,

Hibernate 和 mybatis 的區別?

(1)兩者最大的區別

針對簡單邏輯,Hibernate 與 MyBatis 都有相應的代碼生成工具,可以生成簡單基本的 DAO 層方法,

針對高級查詢,MyBatis 需要手動撰寫 SQL 陳述句,以及 ResultMap,而 Hibernate有良好的映射機制,開發者無需關心 SQL 的生成與結果映射,可以更專注于流程,

(2)開發難度對比

Hibernate 的開發難度大于 MyBatis,主要由于 Hibernate 比較復雜,龐大,學習周期比較長,

MyBatis 則相對簡單,并且 MyBatis 主要依賴于生氣了的書寫,讓開發者剛進更熟悉,

(3)sql 書寫比較

Hibernate 也可以自己寫 sql 來指定需要查詢的欄位,但這樣就破壞了Hibernate 開發的簡潔性,不過 Hibernate 具有自己的日志統計,

MyBatis 的 sql 是手動撰寫的,所以可以按照要求指定查詢的欄位,不過沒有自己的日志統計,所以要借助 Log4j 來記錄日志,

(4)資料庫擴展性計較Hibernate 與資料庫具體的關聯在 XML 中,所以 HQL 對具體是用什么資料庫
并不是很關心MyBatis 由于所有 sql 都是依賴資料庫書寫的,所以擴展性、遷移性比較差,

(5)快取機制比較

Hibernate 的二級快取配置在 SessionFactory 生成組態檔中進行詳細配置,然后再在具體的表物件映射中配置那種快取,

MyBatis 的二級快取配置都是在每個具體的表物件映射中進行詳細配置,這樣針對不同的表可以自定義不同的緩沖機制,并且 MyBatis 可以在命名空間中共享相同的快取配置和實體,通過 Cache-ref 來實作,

兩者比較,因為 Hibernate 對查詢物件有著良好的管理機制,用戶無需關心 SQL,所以在使用二級快取時如果出現臟資料,系統會報出錯誤提示, 而 MyBatis 在這一方面使用二級快取時需要特別小心,如果不能完全去頂資料更新操作的波及范圍,避免 cache 的盲目使用,否則,臟資料的出現會給系統的正常運行帶來很大的隱患,

mybatis 是如何作業的?

一、Mybatis 作業原理圖

mybatis 原理圖如下所示:

在這里插入圖片描述

二、作業原理決議

mybatis 應用程式通過 SqlSessionFactoryBuilder 從 mybatis-config.xml 組態檔(也可以用 Java 檔案配置的方式,需要添加@Configuration)來構建 SqlSessionFactory(SqlSessionFactory 是執行緒安全的);

然后,SqlSessionFactory 的實體直接開啟一個 SqlSession,再通過 SqlSession 實體獲得 Mapper 物件并運行 Mapper 映射的 SQL 陳述句,完成對資料庫的 CRUD 和事務提交,之后關閉 SqlSession,說明:SqlSession 是單執行緒物件,因為它是非執行緒安全的,是持久化操作的獨享物件,類似 jdbc 中的 Connection,底層就封裝了 jdbc 連接,

詳細流程如下:

(1)、加載 mybatis 全域組態檔(資料源、mapper 映射檔案等),決議組態檔,MyBatis 基于 XML 組態檔生成 Configuration,和一個個 MappedStatement(包括了引數映射配置、動態 SQL 陳述句、結果映射配置),其對應著標簽項,

(2)、SqlSessionFactoryBuilder 通過 Configuration 物件生成 SqlSessionFactory,用來開啟 SqlSession,

(3)、SqlSession 物件完成和資料庫的互動:

a、用戶程式呼叫 mybatis 介面層 api(即 Mapper 介面中的方法)

b、SqlSession 通過呼叫 api 的 Statement ID 找到對應的 MappedStatement 物件

c、通過 Executor(負責動態 SQL 的生成和查詢快取的維護)將 MappedStatement物件進行決議,sql 引數轉化、動態 sql 拼接,生成 jdbc Statement 物件

d、JDBC 執行 sql,

e、借助 MappedStatement 中的結果映射關系,將回傳結果轉化成 HashMap、JavaBean 等存盤結構并回傳,

Hibernate 物件有幾個狀態值?

Transient 瞬時 :物件剛 new 出來,還沒設 id,設了其他值,

Persistent 持久:呼叫了 save()、saveOrUpdate(),就變成 Persistent,有 id

Detached 脫管 : 當 session close()完之后,變成 Detached,

簡述 Springmvc 的流程;

spring 作業的流程

流程如下:(1)用戶發起請求到前端控制器(DispatcherServlet),該控制器會過濾出哪些請求可以訪問 Servlet、哪些不能訪問,就是 url-pattern 的作用,并且會加載springmvc.xml 組態檔,

(2)前端控制器會找到處理器映射器(HandlerMapping),通過 HandlerMapping完成 url 到 controller 映射的組件,簡單來說,就是將在 springmvc.xml 中配置的或者注解的 url 與對應的處理類找到并進行存盤,用 map<url,handler>這樣的方式來存盤,

(3)HandlerMapping 有了映射關系,并且找到 url 對應的處理器,HandlerMapping就會將其處理器(Handler)回傳,在回傳前,會加上很多攔截器,

(4)DispatcherServlet 拿到 Handler 后,找到 HandlerAdapter(處理器配接器),通過它來訪問處理器,并執行處理器,

(5)執行處理器

(6)處理器會回傳一個 ModelAndView 物件給 HandlerAdapter

(7) 通 過 HandlerAdapter 將 ModelAndView 對 象 返 回 給 前 端 控 制 器(DispatcherServlet)

(8)前端控制器請求視圖決議器(ViewResolver)去進行視圖決議,根據邏輯視圖名決議成真正的視圖(jsp),其實就是將 ModelAndView 物件中存放視圖的名稱進行查找,找到對應的頁面形成視圖物件

(9)回傳視圖物件到前端控制器,

(10)視圖渲染,就是將 ModelAndView 物件中的資料放到 request 域中,用來讓頁面加載資料的,

(11)通過第 8 步,通過名稱找到了對應的頁面,通過第 10 步,request 域中有了所需要的資料,那么就能夠進行視圖渲染了,最后將其回傳即可,

Springmvc 和 Springboot 有什么區別?

Spring MVC 是基于 Spring 的一個 MVC 框架 ;

Spring Boot 是基于 Spring4 的條件注冊的一套快速開發整合包,

Springboot 為什么配置簡單?(即它自動做了什么操作才能簡化程式員的操作)
主要是使用了 spring3 之后提供的注解,來代替 xml 檔案的配置,最核心的是以下兩個注解

@Configuration,標注在類上,相當于定義一個配置類,一份 spring 的組態檔

@Bean,類似于 spring 組態檔中的通過這兩個注解就可以用 java 代碼的方式來完成相關 spring 配置

持久層設計要考慮的問題有哪些?請談一下你用過的持久層框架都有哪些?

"持久"就是將資料保存到可掉電式存盤設備中以便今后使用,簡單的說,就是將記憶體中的資料保存到關系型資料庫、檔案系統、訊息佇列等提供持久化支持的設備中,持久層就是系統中專注于實作資料持久化的相對獨立的層面,

持久層設計的目標包括:

資料存盤邏輯的分離,提供抽象化的資料訪問介面,

資料訪問底層實作的分離,可以在不修改代碼的情況下切換底層實作,

資源管理和調度的分離,在資料訪問層實作統一的資源調度(如快取機制),

資料抽象,提供更面向物件的資料操作,

持久層框架有: Hibernate、MyBatis、TopLink、 Guzz、 jOOQ、 Spring Data、ActiveJDBC

需要更多技術檔案可以在后臺私信【學習】
在這里插入圖片描述

file

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160518.html

標籤:Java

上一篇:XML--約束

下一篇:Python3中的常量和部分案例詳解,90%的人都不懂

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more