-
java物件導向程式設計
物件導向(概念):
現實世界存在的任務事物都可以稱之為物件,物件導向是對現實世界建模的一種方式,將一種抽象的思想給具體例項化,
物件中包含的內容特徵是它的屬性,物件的一些操作行為是它的方法。例如簡歷就是一個物件,裡面的內容是它的屬性,
看、拿、放都可以稱為這個物件的方法。
複製程式碼
-
三大特性:
-
封裝:
封裝,就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。一個類就是一個封裝了資料以及操作這些資料的程式碼的邏輯實體。在一個物件內部,某些程式碼或某些資料可以是私有的,不能被外界訪問。通過這種方式,物件對內部資料提供了不同級別的保護,以防止程式中無關的部分意外的改變或錯誤的使用了物件的私有部分。
-
繼承:
繼承,指可以讓某個型別的物件獲得另一個型別的物件的屬性的方法。它支援按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”,“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實現繼承,可以通過“繼承”和“組合”來實現。繼承概念的實現方式有兩類:實現繼承與介面繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;介面繼承是指僅使用屬性和方法的名稱,但是子類必須提供實現的能力。
-
多型:
多型,是指一個類例項的相同方法在不同情形有不同表現形式。多型機制使具有不同結構內部的物件可以共享相同的外部介面。這意味著,雖然針對不同物件的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以呼叫。
-
-
五大原則
-
單一職責原則(SRP)
是指一個類的功能要單一,不能包羅永珍。如同一個人一樣,分配的工作不能太多,否則一天到晚雖然忙忙碌碌的,但效率卻高不起來。
-
開放封閉原則(OCP)
一個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。
-
里氏替換原則(LSP)
子類應當可以替換父類並出現在父類能夠出現的任何地方。
-
依賴倒置原則(DIP)
高層模組不應該依賴低層模組,二者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象。
依賴倒置的核心思想是面向介面程式設計。 依賴倒置的一個核心原則就是降低耦合性 -
介面分離原則(ISP)
模組間要通過抽象介面隔離開,而不是通過具體的類強耦合起來。
-
-
高內聚,低耦合
-
高內聚
高內聚是針對類內部的方法而言,把程式的功能儘量分散,別在一個類裡只寫一個方法,這樣會給除錯等帶來很多麻煩。
所謂高內聚是指一個軟體模組是由相關性很強的程式碼組成,只負責一項任務,也就是常說的單一原則。
-
低耦合
低耦合是針對類與類之間的關係而定,意思是類之間的關係要簡單,不要有很強的依賴關係,不然,執行起來就會出問題,使一個類的執行影響到其他的類。
-
-
常用的設計模式
-
單例模式
一個類在java虛擬機器中只有一個物件,並提供一個全域性訪問點
- 解決問題:物件的唯一性,效能浪費太多。
- 應用場景:資料庫連線物件,屬性配置檔案的讀取物件。
- 模式結構:餓漢式和懶漢式(如果考慮效能的話,就用懶漢式,因為懶漢式是在方法裡面進行初始化的),構造器私有化,對外提供方法加同步關鍵字。
餓漢式: public class HurgrySingleton { private static HurgrySingleton hurgry=new HurgrySingleton(); private HurgrySingleton(){}; public static HurgrySingleton getSinletonHurgry(){ return hurgry; } } 複製程式碼
懶漢式: public class LarzySingleton { private static LarzySingleton larzy=null; private LarzySingleton(){}; public static synchronized Larzy getSinletonLarzy(){ if(larzy==null){ larzy=new LarzySingleton(); } return larzy; } } 複製程式碼
-
簡單工廠
用一個方法來代替new關鍵字
Spring的核心就是工廠模式。
- 解決問題:物件產生過多,或者經常有子類替換生成。
- 應用場景:對於經常生成的物件,或者父子類替換生成。
- 模式結構:寫一個對外宣告的方法,方法裡面使用new關鍵字代替。
-
-
1. 定義一個操作的介面: public interface Operation { public double getResult(double numberA,double numberB) throws Exception; } 2. 定義具體的操作類: public class Add implements Operation{ // 加法計算 public double getResult(double numberA, double numberB) { return numberA + numberB; } } public class Sub implements Operation{ // 減法計算 public double getResult(double numberA, double numberB) { return numberA-numberB; } } public class Mul implements Operation{ // 乘法計算 public double getResult(double numberA, double numberB) { return numberA * numberB; } } public class Div implements Operation { // 除法計算 public double getResult(double numberA, double numberB) throws Exception { if (numberB == 0) { throw new Exception("除數不能為0!"); } return numberA / numberB; } } 3.定義簡單工廠類 public class EasyFactory { // 簡單工廠,根據字串建立相應的物件 public static Operation createOperation(String name) { Operation operationObj = null; switch (name) { case "+": operationObj = new Add(); break; case "-": operationObj = new Sub(); break; case "*": operationObj = new Mul(); break; case "/": operationObj = new Div(); break; } return operationObj; } } 4.測試 public class Client { public static void main(String[] args) throws Exception { Operation add = EasyFactory.createOperation("+"); Operation sub = EasyFactory.createOperation("-"); Operation mul = EasyFactory.createOperation("*"); Operation div = EasyFactory.createOperation("/"); } } 複製程式碼
-
代理模式(Proxy)
為其他物件提供一個代理,以控制對當前物件的訪問
Spring裡面的AOP實現。
- 解決問題:不能直接訪問該物件,或者太大的資源耗費多。
- 應用場景:許可權,或者大物件的訪問許可權。
- 模式結構:代理類和被代理類實現同一個介面,使用者訪問的時候先訪問代理物件,然後讓代理物件去訪問被代理物件。
建立一個介面: public interface SellHouse { void sell(double money); } 建立一個被代理類: public class Hoster implements SellHouse { @Override public void sell(double money) { System.out.println("祝你居住愉快"); } } 建立一個代理類: public class Medium implements SellHouse { SellHouse hoster=new Hoster(); @Override public void sell(double money) { if(money>=1000){ hoster.sell(money); }else{ System.out.println("你的價格太低了"); } } } 測試類: public class Renter { public static void main(String[] args) { SellHouse renter=new Medium(); renter.sell(500); } } 複製程式碼
-
介面卡模式
將兩個原來不相容的類相容起來一起工作
類介面卡和物件介面卡的區別:類介面卡通過繼承來完成適配,物件介面卡則是通過關聯(組合)來完成。
-
解決問題:以及存在的相同功能的程式碼,但是介面不相容,不能直接呼叫。
-
應用場景:在使用舊的API的時候,沒有原始碼,和新的不能相容。
-
模式結構:分為類介面卡和物件適配,一般常用的就是物件介面卡,因為組合優於繼承。
-
類介面卡:
在目標介面中的 request() 呼叫 Adaptee 的 adapteeRequest() 方法呢?
已存在的將被適配的類: public class Adaptee { public void adapteeRequest() { System.out.println("被適配者的方法"); } } 定義一個目標介面: public interface Target { void request(); } 介面卡類: public class Adapter extends Adaptee implements Target{ @Override public void request() { //...一些操作... super.adapteeRequest(); //...一些操作... } } 複製程式碼
- 物件介面卡:
public class Adapter implements Target{ // 適配者是物件介面卡的一個屬性 private Adaptee adaptee = new Adaptee(); @Override public void request() { //... adaptee.adapteeRequest(); //... } } 複製程式碼
-
-
策略模式
定義一系列演算法並可以互相替換
- 解決問題:做一件事情有很多種方法。
- 應用場景:購物車裡面的付款方式。
- 模式結構:宣告一個頂級介面,定義一個策略方法,具體的例項都要實現這個介面。
定義一個頂級介面: public interface Person { void repast(); } 具體的例項類1: public class African implements Person { @Override public void repast() { System.out.println("非洲人用手吃飯"); } } 具體的例項類2: public class America implements Person { @Override public void repast() { System.out.println("美國人用刀叉吃飯"); } } 具體的例項類3: public class Chinese implements Person { @Override public void repast() { System.out.println("中國人用筷子吃飯"); } } 測試類: public class Test { public static void main(String[] args) { Person chinese=new Chinese(); Person america=new America(); Person african=new African(); chinese.repast(); america.repast(); african.repast(); } } 複製程式碼
-
-
專案管理工具
-
Maven
- 優點:
- Maven是一個專案管理和綜合工具。Maven提供了開發人員構建一個完整的生命週期框架。
- 在多個開發團隊環境時,Maven可以設定按標準在非常短的時間裡完成配置工作,使開發人員的工作更加輕鬆。
- Maven增加可重用性並負責建立相關的任務。
- 缺點:
- maven是一個龐大的構建系統,學習難度大
- maven採用約定優於配置的策略(convention overconfiguration),雖然上手容易,但是一旦出了問題,難於除錯。
- 當依賴很多時,m2eclipse 老是搞得Eclipse很卡。
- 中國的網路環境差,很多repository無法訪問,比如google code, jboss 倉庫無法訪問等。
-
SVN
- 優點:
- 管理方便,邏輯明確,符合一般人思維習慣。
- 易於管理,集中式伺服器更能保證安全性。
- 程式碼一致性非常高。
- 適合開發人數不多的專案開發。
- 缺點:
- 伺服器壓力太大,資料庫容量暴增。
- 如果不能連線到伺服器上,基本上不可以工作,看上面第二步,如果伺服器不能連線上,就不能提交,還原,對比等等。
- 不適合開源開發(開發人數非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明確的許可權管理機制(例如分支訪問限制),可以實現分層管理,從而很好的解決開發人數眾多的問題。
-
Git
- 優點:
- 適合分散式開發,強調個體。
- 公共伺服器壓力和資料量都不會太大。
- 速度快、靈活。
- 任意兩個開發者之間可以很容易的解決衝突。
- 離線工作。
- 缺點:
- 學習週期相對而言比較長。
- 不符合常規思維。
- 程式碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有程式碼和版本資訊。
-
-
常用的一些開源框架
-
Spring
Spring是一個輕量級的IOC和AOP容器框架。是為java應用程式提供基礎性服務的一套框架,目的是簡化企業應用程式的開發,它使得開發者只需要關心業務需求。
-
AOP:面向切面程式設計
AOP:面向切面程式設計,將跟業務邏輯沒有關係的程式碼提取出來,在呼叫目標方法之前或者之後執行。 常用的場景,事務,日誌,許可權控制,異常處理等方面。
AOP實現的關鍵在於代理模式,AOP代理主要分為靜態代理和動態代理。
- AspectJ是靜態代理的增強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強,他會在編譯階段將AspectJ(切面)織入到java位元組碼中,執行的時候就是增強之後的AOP物件。
- Spring AOP使用的是動態代理,所謂的動態代理就是說AOP框架不會去修改位元組碼。而是每次執行時在記憶體裡臨時為方法生成一個AOP物件,這個AOP物件包含了目標物件的全部方法,並且在特定的切點做了增強處理,並回撥原物件的方法。
SpringAOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理
-
IOC:控制反轉
IOC:建立物件的權利,交給spring容器建立。
-
DI:依賴注入
DI:如果一個物件A需要使用另一個物件B才能實現某個功能,這時就可以說A物件依賴於B物件, 而spring容器在建立A物件時,會自動將A物件需要的B注入到A物件中,此過程就是依賴注入。
-
核心容器
核心容器提供 Spring 框架的基本功能。核心容器的主要元件是 BeanFactory, 它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程式的配置 和依賴性規範與實際的應用程式程式碼分開。
-
Spring上下文
Spring 上下文是一個配置檔案,向 Spring 框架提供上下文資訊。Spring 上下文包括企業服務, 例如 JNDI、EJB、電子郵件、國際化、校驗和排程功能。
-
Spring DAO:
JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的 錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和 關閉連線)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
-
Spring ORM:
Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的物件關係工具,其中包括 JDO、 Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
-
Spring Web 模組
Web 上下文模組建立在應用程式上下文模組之上,為基於 Web 的應用程式提供了上下文。所以, Spring 框架支援與 Jakarta Struts 的整合。Web 模組還簡化了處理多部分請求以及 將請求引數繫結到域物件的工作。
-
-
SpringMVC
-
對SpringMVC框架的理解:
mvc指的是Model(業務模型),View(檢視),Controller(控制器)
SpringMVC就是Spring框架的一個模組,所以它可以和spring框架進行無縫結合,它是一個基於mvc設計思想的前端web層框架,主要作用就是對前端請求進行處理。它的前端控制器是一個servlet,它的請求攔截是基於方法級別的。
-
執行流程:
SpringMVC框架主要由DispatcherServlet,處理器對映,處理器(控制器),檢視解析器,檢視組成。
1. 客戶端請求提交到DispatcherServlet 2. 由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller 3. DispatcherServlet將請求提交到Controller 4. Controller呼叫業務邏輯處理後,返回ModelAndView 5. DispatcherServlet查詢一個或多個ViewResoler檢視解析器,找到ModelAndView指定的檢視 6. 檢視負責將結果展示到客戶端 複製程式碼
-
-
SpringBoot
-
什麼是springboot?
Spring Boot基本上是Spring框架的擴充套件,它消除了設定Spring應用程式所需的XML配置,為更快,更高效的開發生態系統鋪平了道路。
Spring Boot應用程式的入口點是使用@SpringBootApplication註釋的類
- 用來簡化spring應用的初始搭建以及開發過程 使用特定的方式來進行配置(propertites或yml檔案)
- 建立獨立的spring應用程式main方法執行
- 嵌入的tomcat無需部署war檔案
- 簡化maven配置
- 自動配置spring 新增對應功能starter自動化配置
-
springboot常用的starter有哪些?
spring-boot-starter-web嵌入tomcat和webkaifa需要servlet與jsp支援
spring-boot-starter-data-jpa資料庫支援
spring-boot-starter-data-redis資料庫支援
spring-boot-starter-data-solr solr支援
mybatis-spring-boot-starter第三方的mybatis整合starter
-
springboot自動配置的原理
在spring程式main方法中新增@SpringBootApplication或者@EnableAutoConfiguration會自動去maven中讀取每個starter中的spring.factories檔案,該檔案配置了所有需要被建立spring容器中的bean
-
springboot讀取配置檔案的方式
springboot預設讀取配置檔案為application.properties或者application.yml
-
@SpringBootApplication 是做什麼的?
根據 Spring Boot 文件, @SpringBootApplication 註解相當於使用 @Configuration 、@EnableAutoConfiguration 和 @ComponentScan 及其預設屬性。Spring Boot 允許開發人員使用單個註解而不是多個註解。但是,正如我們所知,Spring 提供了鬆散耦合的特性,我們可以根據專案的需要單獨使用每個註解。
-
Spring Boot有哪些優點?
- 快速建立獨立執行的spring專案與主流框架整合
- 使用嵌入式的servlet容器,應用無需打包成war包
- starters自動依賴與版本控制
- 大量的自動配置,簡化開發,也可修改預設值
- 準生產環境的執行應用監控
- 與雲端計算的天然整合
-
Spring Boot中的監視器是什麼?
Spring boot actuator是spring啟動框架中的重要功能之一。Spring boot監視器可幫助您訪問生產環境中正在執行的應用程式的當前狀態。 有幾個指標必須在生產環境中進行檢查和監控。即使一些外部應用程式可能正在使用這些服務來向相關人員觸發警報訊息。監視器模組公開了一組可直接作為HTTP URL訪問的REST端點來檢查狀態。
-
springboot自動配置的原理
在spring程式main方法中 新增@SpringBootApplication或者@EnableAutoConfiguration 會自動去maven中讀取每個starter中的spring.factories檔案 該檔案裡配置了所有需要被建立spring容器中的bean
-
總結Spring Boot Starter的工作原理
- Spring Boot 在啟動時掃描專案所依賴的JAR包,尋找包含spring.factories檔案的JAR
- 根據spring.factories配置載入AutoConfigure類
- 根據 @Conditional註解的條件,進行自動配置並將Bean注入Spring Context
-
Spring Boot、Spring MVC 和 Spring 有什麼區別?
SpringFrame
SpringFramework 最重要的特徵是依賴注入。所有 SpringModules 不是依賴注入就是 IOC 控制反轉。 當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發鬆耦合應用。鬆耦合應用的單元測試可以很容易的進行。 複製程式碼
SpringMVC
Spring MVC 提供了一種分離式的方法來開發 Web 應用。通過運用像 DispatcherServelet, MoudlAndView 和 ViewResolver 等一些簡單的概念,開發 Web 應用將會變的非常簡單。 複製程式碼
SpringBoot
Spring 和 SpringMVC 的問題在於需要配置大量的引數。 Spring Boot通過一個自動配置和啟動的項來目解決這個問題。 複製程式碼
-
Spring Boot 的核心註解是哪個?它主要由哪幾個註解組成的?
-
@SpringBootApplication是啟動類上面的註解,它也是 Spring Boot 的核心註解,主要組合包含了以下 3 個註解:
-
@SpringBootConfiguration:組合了 @Configuration 註解,實現配置檔案的功能。
-
@EnableAutoConfiguration:開啟自動配置的功能,也可以關閉某個自動配置的選項,如關閉資料來源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
-
@ComponentScan:Spring元件掃描。
-
-
-
SpringCloud
-
什麼是微服務?
以前的模式是所有的程式碼在同一個工程中 部署在同一個伺服器中 同一個專案的不同模組不同功能互相搶佔資源
微服務 將工程根據不同的業務規則拆分成微服務 微服務部署在不同的機器上 服務之間進行相互呼叫
java微服務的框架有dubbo(只能用來做微服務),springCloud(提供了服務的發現,斷路器等)
-
什麼是spring cloud?
SpringCloud為開發人員提供了快速構建分散式系統的一些通用模式(例如配置管理,服務發現,斷路器,智慧路由,微代理,控制匯流排,一次性令牌,全域性鎖,領導選舉,分散式會話,群集狀態)。分散式系統的協調導致了鍋爐板模式,並且使用Spring Cloud開發人員可以快速地站起來來實現這些模式的服務和應用程式。它們可以在任何分散式環境中正常工作,包括開發人員自己的膝上型電腦,裸機資料中心和受管平臺,Cloud Foundry。
-
springcloud如何實現服務的註冊和發現
服務在釋出時 指定對應的服務名(服務名包括了IP地址和埠) 將服務註冊到註冊中心(eureka或者zookeeper)
這一過程時springcloud自動實現,只需要在main方法新增@EnableDisscoveryClient 同一個服務修改埠就可以啟動多個例項
呼叫方法:傳遞服務名稱通過註冊中心獲取所有的可用例項,通過負載均衡策略呼叫(ribbon和feign)對應的服務
-
SpringCloud斷路器的作用
當一個服務呼叫另一個服務由於網路原因或者自身原因出現問題時 ,呼叫者就會等待被調者的響應,
當更多的服務請求到這些資源時,導致更多的請求等待,這樣就會發生連鎖效應,斷路器就是解決這一問題的。
斷路器有完全開啟狀態: 一定時間內,達到一定的次數無法呼叫,並且多次檢測沒有恢復的跡象,斷路器完全開啟,那麼下次的請求不會請求到該服務。 半開: 短時間內有回覆跡象,斷路器會將部分請求傳送給服務,當能正常呼叫時,斷路器關閉。 關閉: 當服務一直處於正常狀態,能正常呼叫,斷路器關閉。 複製程式碼
-
-
MyBatis
-
對Mybatis的理解
Mybatis是一個優秀的ORM框架,應用在持久層,它對jdbc的運算元據庫過程進行封裝,使開發者只關注SQL本身,而不需要花費精力去處理例如註冊驅動,建立connection,等jdbc繁雜的過程程式碼,一般用mapper代理的方式開發,直接在xml裡面寫sql。
-
Mybatis的工作流程
1. mybatis配置 SqlMapConfig.xml,此檔案作為mybatis的全域性配置檔案,配置類mybatis的執行環境等資訊。 2. 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠。 3. 由會話工廠建立sqlSession即會話,運算元據庫需要通過SqlSession(DefaultSqlSession)進行。 4. mybatis底層自定義類Executor(BaseExecutor)執行器介面運算元據庫,Executor介面有 兩個實現,一個是基本執行器、一個是快取執行器。 5. Mapped Statement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。 mapper.xml檔案中一個sql對應一個Mapped Statement物件,sql的id即是Mapped statement的id。 6. Mapped Statement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過 Mapped Statement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是jdbc程式設計中對 preparedStatement設定引數。 7. Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本型別、pojo,Executor 通過 Mapped Statement在執行sql後將輸出結果對映至java物件中,輸出結果對映過程相當於jdbc 程式設計中對結果的解析處理過程。 複製程式碼
-
-
Hibernate
-
對hibernate的理解
Hibernate是輕量級的持久層解決方案,是一個關聯式資料庫ORM框架, 對JDBC訪問資料庫的程式碼做了封裝.我們可以很容易的對資料庫進行增刪改查操作.
-
hibernate的查詢方式
(1)導航物件圖檢索方式。根據已經載入的物件,導航到其他物件。
(2)OID檢索方式。使用get或者load載入對應的物件
(3)HQL檢索方式。
(4)QBC檢索方式。
(5)SQL檢索方式。
-
sql與hsql的區別
(1)sql是直接運算元據庫的
(2)hql是通過操作物件運算元據庫,對大小寫敏感。
-
一級快取和二級快取的區別
一級快取是session級別的快取,二級快取是sessionFactory級別的快取。
-
hibernate中get和load的區別?
get和load都是根據id獲取資料。
(1)get先查詢session中對應id是否有資料,如果有則直接返回,有查詢資料庫,如資料庫中沒有則返回為null;
(2)load方式查詢session中對應id是否有資料,如果沒有生成代理物件,查詢資料庫。如沒有對應的id則丟擲異常
- hibernate和mybatis對比?
-
在移植性方面hibernate配置一下方言即可.而一般情況下mybatis則需要修改sql語句
-
hibernate是一個完全的ORM框架.完全的物件導向.更符合我們開發者的思維模式.mybatis需要我們手動寫sql語句
-
hibernate的優化成本比較高.因為hibernate的sql語句是自動生成的,所以在優化方面一般的新手無從下手.而mybatis只要修改sql就可以了.更加容易上手
-
-
Spring Data JPA
- ORM對映後設資料:支援XML和註解兩種後設資料的形式,後設資料描述物件和表之間的對映關係。
- API:操作實體物件來執行CRUD操作
- 查詢語言:通過物件導向而非面向資料庫的查詢語言(JPQL)查詢資料,避免程式的SQL語句緊密耦合。
使用SpringData建立查詢
1. 宣告一個介面繼承自Repository或Repository的一個子介面,對於Spring Data JPA通常是JpaRepository 2. 在介面中宣告查詢方法,如findOneByCustomerId() 3. 在application.properties或在application.yml檔案中配置幾個屬性即可。 4. 在需要的介面中注入Reposotiry即可。 複製程式碼
JPA和Hibernate的區別?
Hibernate是JPA規範的一個具體實現 hibernate有JPA沒有的特性 hibernate 的效率更快 JPA 有更好的移植性,通用性 複製程式碼
SpringDataJPA的一些常用語法
//根據firstName與LastName查詢(兩者必須在資料庫有) DemoJpa findByFirstNameAndLastName(String firstName, String lastName); //根據firstName或LastName查詢(兩者其一有就行) DemoJpa findByLastNameOrFirstName(String lastName,String firstName); //根據firstName查詢它是否存在資料庫裡<類似與以下關鍵字> //DemoJpa findByFirstName(String firstName); DemoJpa findByFirstNameIs(String firstName); //在Age數值age到age2之間的資料 List<DemoJpa> findByAgeBetween(Integer age, Integer age2); //小於指定age數值之間的資料 List<DemoJpa> findByAgeLessThan(Integer age); //小於等於指定age數值的資料 List<DemoJpa> findByAgeLessThanEqual(Integer age); //大於指定age數值之間的資料 List<DemoJpa> findByAgeGreaterThan(Integer age); //大於或等於指定age數值之間的資料 List<DemoJpa> findByAgeGreaterThanEqual(Integer age); //在指定age數值之前的資料類似關鍵字<LessThan> List<DemoJpa> findByAgeAfter(Integer age); //在指定age數值之後的資料類似關鍵字<GreaterThan> List<DemoJpa> findByAgeBefore(Integer age); //返回age欄位為空的資料 List<DemoJpa> findByAgeIsNull(); //返回age欄位不為空的資料 List<DemoJpa> findByAgeNotNull(); //根據age選取所有的資料來源並按照LastName進行升序排序 List<DemoJpa> findByAgeOrderByLastName(Integer age); //返回不是指定age的所有資料 List<DemoJpa> findByAgeNot(Integer age); 複製程式碼
-
Spring Data Mongodb
hibernate是傳統資料庫的ORM框架(Object Relational Mapping物件關係對映,簡稱,ORM)
mongoDB是nosql的非關係型資料庫
mongoDB的ORM框架,有mongoDB官方提供Morphia框架或者spring-data-mongoDB框架
-
Shiro
-
Shiro的優點
簡單的身份認證, 支援多種資料來源 對角色的簡單的授權, 支援細粒度的授權(方法級) 支援一級快取,以提升應用程式的效能; 內建的基於 POJO 企業會話管理, 適用於 Web 以及非 Web 的環境 非常簡單的加密 API 不跟任何的框架或者容器捆綁, 可以獨立執行 複製程式碼
-
Shiro架構的核心元件
Authenticator:管理登陸登出 Autorizer:授權器賦予主體有那些許可權 session Manager:shiro自己實現session管理器 session DAO:提供了session的增刪改插 Cache Manager:緩衝管理器 Raelms:和資料庫互動的橋樑 複製程式碼
-
Shiro認證過程
建立SecurityManager -> 主體提交認證 -> SecurityManager認證 -> Authenticator認證 -> Realm驗證
-
Shiro授權過程
建立SecurityManager ->主體授權 -> securityManager授權 -> Authorizer授權 ->Realm獲取許可權資料
-
-
-
RestFul
REST(Representational State Transfer)表象化狀態轉變(表述性狀態轉變),在2000年被提出,基於HTTP、URI、XML、JSON等標準和協議,支援輕量級、跨平臺、跨語言的架構設計。是Web服務的一種新的架構風格(一種思想)。
-
REST架構的主要原則
- 網路上的所有事物都被抽象為資源
- 每個資源都有一個唯一的資源識別符號
- 同一個資源具有多種表現形式(xml,json等)
- 對資源的各種操作不會改變資源識別符號
- 所有的操作都是無狀態的
- 符合REST原則的架構方式即可稱為RESTful
-
/emp/1 HTTP GET 查詢id=1的emp
/emp/1 HTTP DELETE 刪除id=1的emp,實驗中直接刪除會報405錯誤,但是採用$.ajax非同步刪除就沒問題
/emp/1 HTTP PUT 跟新emp
/emp/add HTTP POST 新增emp
複製程式碼
-
常用的資料庫
-
mysql
-
mongodb
-
oracle
-
redis
-
詳解:juejin.im/editor/draf…
-
-
memcached快取框架
Memcached是一款開源的、高效能的純記憶體快取服務軟體。Mem是記憶體的意思,cache是快取的意思,d是daemon的意思。 memcache 是專案名稱,也是一款軟體,其架構是C/S架構。
快取: 將資料儲存到記憶體中,只有當磁碟勝任不了的時候,才會啟用快取
缺點:斷電資料丟失(雙電),用快取儲存資料的目的只是為了應付大併發的業務。
資料庫: mysql(關係型資料庫,能夠保證資料一致性,保證資料不丟失,當因為功能太多,導致效能不高) ===資料參考
快取資料庫: memcache redis(非關係型資料庫,效能極高,但不保證資料完整性) === 業務的資料提供者
- memcachedb 會將記憶體的資料寫入到磁碟中
- redis 主要工作場所是記憶體中,但是定期備份記憶體資料到硬碟
memcache優點:
① 對於使用者來講,使用者訪問網站更快了,體驗更好了。 ② 對網站來說,資料庫壓力降低了。只有當記憶體沒有資料時才會去請求資料庫。第一次寫入的資料也會請求資料庫。一般公司沒有預熱,只有當使用者讀取過資料庫才會放到Memcached中。 ③ 提升了網站的併發訪問,減少伺服器數量。 複製程式碼
-
Activiti工作流
-
什麼是工作流,工作流的核心物件是什麼,activiti共運算元據庫多少張表
- 工作流就是多個參與者,按照某種預定義的規則,傳遞業務資訊,進行稽核的功能一個框架(Activiti)
- processEngine,呼叫Service,從而運算元據庫的表
- 23表
-
工作流中的介面
- RepositoryService:流程定義和部署物件
- RuntimeService:執行管理,包括流程例項和執行物件(正在執行)
- TaskService:執行任務相關的(正在執行)
- HistoryService:歷史管理
- IdentityService:Activiti表的使用者角色組
-
-
訊息中介軟體
-
ActiveMQ
ActiveMQ/ApolloMQ
優點:老牌的訊息佇列,使用Java語言編寫。對JMS支援最好,採用多執行緒併發,資源消耗比較大。如果你的主語言是Java,可以重點考慮。
缺點:由於歷史悠久,歷史包袱較多,版本更新很緩慢。叢集模式需要依賴Zookeeper實現。最新架構的產品被命名為Apollo,號稱下一代ActiveMQ,目前案例較少。
-
RabbitMQ
優點:生態豐富,使用者眾,有很多人在前面踩坑。AMQP協議的領導實現,支援多種場景。淘寶的MySQL叢集內部有使用它進行通訊,OpenStack開源雲平臺的通訊元件,最先在金融行業得到運用。
缺點:Erlang程式碼你Hold得住不? 雖然Erlang是天然叢集化的,但RabbitMQ在高可用方面做起來還不是特別得心應手,別相信廣告。
-
-
使用Dubbo分散式服務治理框架及Zookeeper分散式服務協調框架的執行原理及開發
-
Dubbo
-
什麼是分散式?什麼是叢集?主要區別
分散式是將一個服務分個部分,然後通過遠端呼叫方式進行。遠端呼叫框架RPC框架,spring cloud,dubbo。叢集是將同一個服務的多個副本部署在不同的叢集上,通過負載均衡的方式提供複試。場景:廚師。
-
服務治理包括哪些內容?
服務治理需要服務治理框架,dubbo。即對服務進行管理,例如服務的介面名稱,權重等資訊。
-
註冊中心的作用?你怎麼理解註冊中心的?
如果沒有註冊中心,需要在本地維護一個provider的地址列表。註冊中心角色,它是集中式資料管理,消費者通過註冊中心來訪問資料。通過註冊中心,使得provider和consumer之間是透明。
-
什麼是RPC?
遠端呼叫框架。
-
dubbo中負載均衡的策略有哪些?
Provider: 叢集,叢集只需要重啟幾個例項即可。
Zookeeper:叢集
Consumer:叢集
負載:Loadbalence輪詢,隨機
-
-
推薦使用zookeeper註冊中心,還有redis等不推薦。
核心配置有 dubbo:service/ dubbo:reference/ dubbo:protocol/ dubbo:registry/ dubbo:application/ dubbo:provider/ dubbo:consumer/ dubbo:method/
dubbox是噹噹網基於dubbo上做了一些擴充套件,如加了服務可restful呼叫,更新了開源元件等。
複製程式碼
-
Zookeeper
ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,它是叢集的管理者,監視著叢集中各個節點的狀態根據節點提交的反饋進行下一步合理操作。最終,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
zookeeper是一個開源的分散式協調服務框架。
應用場景:分散式通知/協調、負載均衡、配置中心、分散式鎖、分散式佇列等。
Paxos演算法。
選舉演算法及流程。
節點型別:持久節點、持久順序節點、臨時節點、臨時順序節點。
部署模式:單機模式、偽叢集模式、叢集模式。
叢集需要一半以上的機器可用,所以,3臺掛掉1臺還能工作,2臺不能。
複製程式碼
-
Tomcat伺服器,Nginx+Tomcat負載均衡
-
Linux基本操作,基於CentOs的服務環境搭建以及專案部署
-
OAuth2協議的認證機制和執行原理
-
JWT Token認證安全管理
-
Hadoop生態系統,MapReduce計算模型,HDFS分散式檔案系統的執行原理,搭建環境和API。
-
區塊鏈技術,以太坊,智慧合約,Solidity合約編碼,Web3j編碼,與智慧合約整合開發以及私有鏈的部署。