分類
發燒車訊

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

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

需要更多技術文檔可以在後台私信【學習】

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化