面向對象(概念):前端
面向對象(Object Oriented,OO)是軟件開發方法。面向對象的概念和應用已超越了程序設計和軟件開發,
擴展到如數據庫系統、交互式界面、應用結構、應用平臺、分佈式系統、網絡管理結構、CAD技術、人工
智能等領域。面向對象是一種對現實世界理解和抽象的方法,是計算機編程技術發展到必定階段後的產物。
複製代碼
封裝:java
封裝,就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。一個類就是一個封裝類了數據以及操做這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據能夠是私有的,不能被外界訪問。經過這種方式,對象對內部數據提供了不一樣級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。mysql
繼承:web
繼承,指可讓某個類型的對象得到另外一個類型的對象的屬性的方法。它支持按級分類的概念。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。經過繼承建立的新類稱爲「子類」或「派生類」,被繼承的類稱爲「基類」,「父類」或「超類」。繼承的過程,就是從通常到特殊的過程。要實現繼承,能夠經過「繼承」和「組合」來實現。繼承概念的實現方式有兩類:實現繼承與接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱,可是子類必須提供實現的能力。redis
多態:算法
多態,是指一個類實例的相同方法在不一樣情形有不一樣表現形式。多態機制使具備不一樣結構內部的對象能夠共享相同的外部接口。這意味着,雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,它們(那些操做)能夠經過相同的方式予以調用。spring
單一職責原則(SRP)sql
是指一個類的功能要單一,不能一應俱全。如同一我的同樣,分配的工做不能太多,不然一天到晚雖然忙忙碌碌的,但效率卻高不起來。mongodb
開放封閉原則(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的核心就是工廠模式。
public class UserFactory {
public static User createUser(int i){
//若是輸入的是1,就建立它的子類,不然就建立父類
if(i==1){
return new Alices();
}
return new User();
}
}
複製代碼
爲其餘對象提供一個代理,以控制對當前對象的訪問
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();
}
}
複製代碼
父類定義流程,子類實現流程
定義父類,定義流程:
public abstract class IPhoneTemplate {
public void createIPhone(){
setupCpu();
setupAll();
check();
box();
}
protected abstract void box();
protected abstract boolean check();
protected abstract void setupAll();
protected abstract void setupCpu();
}
子類實現父類的細節方法1:
public class ChinaIPhone extends IPhoneTemplate {
@Override
protected void box() {
System.out.println("box()");
}
@Override
protected boolean check() {
System.out.println("check()");
return true;
}
@Override
protected void setupAll() {
System.out.println("setupAll()");
}
@Override
protected void setupCpu() {
System.out.println("setupCpu()");
}
}
子類實現父類的細節方法2:
public class AfricanIPhone extends IPhoneTemplate {
@Override
protected void box() {
System.out.println("box()");
}
@Override
protected boolean check() {
System.out.println("check()");
return true;
}
@Override
protected void setupAll() {
System.out.println("setupAll()");
}
@Override
protected void setupCpu() {
System.out.println("setupCpu()");
}
}
複製代碼
什麼是springboot?
用來簡化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會自動去mavenzhong讀取每一個starter中的spring.factories文件,該文件配置了全部須要被建立spring容器中的bean
springboot讀取配置文件的方式
springboot默認讀取配置文件爲application.properties或者application.yml
什麼是微服務?
之前的模式是全部的代碼在同一個工程中 部署在同一個服務器中 同一個項目的不一樣模塊不一樣功能互相搶佔資源
微服務 將工程根據不一樣的業務規則拆分紅微服務 微服務部署在不一樣的機器上 服務之間進行相互調用
java微服務的框架有dubbo(只能用來作微服務),springCloud(提供了服務的發現,斷路器等)
什麼是spring cloud?
SpringCloud爲開發人員提供了快速構建分佈式系統的一些通用模式(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線,一次性令牌,全局鎖,領導選舉,分佈式會話,羣集狀態)。分佈式系統的協調致使了鍋爐板模式,而且使用Spring Cloud開發人員能夠快速地站起來來實現這些模式的服務和應用程序。它們能夠在任何分佈式環境中正常工做,包括開發人員本身的筆記本電腦,裸機數據中心和受管平臺,Cloud Foundry。
springcloud如何實現服務的註冊和發現
服務在發佈時 指定對應的服務名(服務名包括了IP地址和端口) 將服務註冊到註冊中心(eureka或者zookeeper)
這一過程時springcloud自動實現,只須要在main方法添加@EnableDisscoveryClient 同一個服務修改端口就能夠啓動多個實例
調用方法:傳遞服務名稱經過註冊中心獲取全部的可用實例,經過負載均衡策略調用(ribbon和feign)對應的服務
SpringCloud斷路器的做用
當一個服務調用另外一個服務因爲網絡緣由或者自身緣由出現問題時 ,調用者就會等待被調者的響應,
當更多的服務請求到這些資源時,致使更多的請求等待,這樣就會發生連鎖效應,斷路器就是解決這一問題的。
斷路器有徹底打開狀態:
必定時間內,達到必定的次數沒法調用,而且屢次檢測沒有恢復的跡象,斷路器徹底打開,那麼下次的請求不會請求到該服務。
半開:
短期內有回覆跡象,斷路器會將部分請求發送給服務,當能正常調用時,斷路器關閉。
關閉:
當服務一直處於正常狀態,能正常調用,斷路器關閉。
複製代碼
對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. 視圖負責將結果展現到客戶端
複製代碼
Spring通常是做爲容器管理其餘框架
AOP:面向切面編程
AOP:面向切面編程,將跟業務邏輯沒有關係的代碼提取出來,在調用目標方法以前或者以後執行。 經常使用的場景,事務,日誌,權限控制,異常處理等方面。
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 AOP:
經過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。因此, 能夠很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中 的對象提供了事務管理服務。經過使用 Spring AOP,不用依賴 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 模塊還簡化了處理多部分請求以及 將請求參數綁定到域對象的工做。
對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是輕量級的持久層解決方案,是一個關係數據庫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則須要修改sql語句
hibernate是一個徹底的ORM框架.徹底的面向對象.更符合咱們開發者的思惟模式.mybatis須要咱們手動寫sql語句
hibernate的優化成本比較高.由於hibernate的sql語句是自動生成的,因此在優化方面通常的新手無從下手.而mybatis只要修改sql就能夠了.更加容易上手
JPA意即Java持久化API,是在JDK5.0後提出的持久化規劃,JPA的出現主要是爲了簡化持久層開發以及整合ORM技術。
使用SpringData建立查詢
1. 聲明一個接口繼承自Repository或Repository的一個子接口,對於Spring Data JPA一般是JpaRepository
2. 在接口中聲明查詢方法,如findOneByCustomerId()
3. 在application.properties或在application.yml文件中配置幾個屬性便可。
4. 在須要的接口中注入Reposotiry便可。
複製代碼
hibernate是傳統數據庫的ORM框架(Object Relational Mapping對象關係映射,簡稱,ORM)
mongoDB是nosql的非關係型數據庫
mongoDB的ORM框架,有mongoDB官方提供Morphia框架或者spring-data-mongoDB框架
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獲取權限數據
Memcached是一款開源的、高性能的純內存緩存服務軟件。Mem是內存的意思,cache是緩存的意思,d是daemon的意思。 memcache 是項目名稱,也是一款軟件,其架構是C/S架構。
緩存: 將數據存儲到內存中,只有當磁盤勝任不了的時候,纔會啓用緩存
缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是爲了應付大併發的業務。
數據庫: mysql(關係型數據庫,可以保證數據一致性,保證數據不丟失,當由於功能太多,致使性能不高) ===數據參考
緩存數據庫: memcache redis(非關係型數據庫,性能極高,但不保證數據完整性) === 業務的數據提供者
memcache優勢:
① 對於用戶來說,用戶訪問網站更快了,體驗更好了。
② 對網站來講,數據庫壓力下降了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據也會請求數據庫。通常公司沒有預熱,只有當用戶讀取過數據庫纔會放到Memcached中。
③ 提高了網站的併發訪問,減小服務器數量。
複製代碼
ActiveMQ/ApolloMQ
優勢:老牌的消息隊列,使用Java語言編寫。對JMS支持最好,採用多線程併發,資源消耗比較大。若是你的主語言是Java,能夠重點考慮。
缺點:因爲歷史悠久,歷史包袱較多,版本更新很緩慢。集羣模式須要依賴Zookeeper實現。最新架構的產品被命名爲Apollo,號稱下一代ActiveMQ,目前案例較少。
優勢:生態豐富,使用者衆,有不少人在前面踩坑。AMQP協議的領導實現,支持多種場景。淘寶的MySQL集羣內部有使用它進行通信,OpenStack開源雲平臺的通訊組件,最早在金融行業獲得運用。
缺點:Erlang代碼你Hold得住不? 雖然Erlang是自然集羣化的,但RabbitMQ在高可用方面作起來還不是特別駕輕就熟,別相信廣告。
什麼是分佈式?什麼是集羣?主要區別
分佈式是將一個服務分個部分,而後經過遠程調用方式進行。遠程調用框架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是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,它是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操做。最終,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
zookeeper是一個開源的分佈式協調服務框架。
應用場景:分佈式通知/協調、負載均衡、配置中心、分佈式鎖、分佈式隊列等。
Paxos算法。
選舉算法及流程。
節點類型:持久節點、持久順序節點、臨時節點、臨時順序節點。
部署模式:單機模式、僞集羣模式、集羣模式。
集羣須要一半以上的機器可用,因此,3臺掛掉1臺還能工做,2臺不能。
複製代碼