1. 程式人生 > >程式設計師必須掌握的Java 框架,小白學會之後15k不是問題

程式設計師必須掌握的Java 框架,小白學會之後15k不是問題

## Spring 的核心特性是什麼?Spring 優點? Spring 的核心是控制反轉(IoC)和麵向切面(AOP) Spring 優點: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202006/1973721-20200620193717313-1289963724.png) 程式設計師必須掌握的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 的依賴關係。 ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202006/1973721-20200620193717889-61896832.png) 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 原理圖如下所示: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202006/1973721-20200620193718364-1287288514.png) **二、工作原理解析** 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 與對應的處理類找到並進行儲存