**前端
Java常見面試題目考點(四) java
一、談談你對Spring的理解web
Spring容器的主要核心是:控制反轉(IOC), 依賴注入(DI)和麪向切面(AOP)面試
① 控制反轉: 傳統的java開發模式中,當須要一個對象時,咱們會本身使用new或者getInstance等直接或者間接調用構造方法建立一個對象。而在spring開發模式中,spring容器使用了工廠模式爲咱們建立了所須要的對象,直接調用就能夠了;redis
② 依賴注入: spring使用javaBean對象的set方法或者帶參的構造方法爲咱們在建立所需對象時將其屬性自動設置所須要的值的過程,就是依賴注入的思想。spring
③ 面向切面編程: 將一個個的對象某些相似的方面橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日誌等,底層是動態代理。sql
spring的啓動過程?數據庫
① 建立全局的上下文環境,這個上下文就是ServletContext;編程
② 在web容器啓動時,會觸發容器初始化事件, 其contextInitialized方法會被調用,在這個方法中,spring會初始 化一個啓動上下文,這個上下文被稱爲根上下文,即WebApplicationContext;設計模式
③ 監聽器初始化完畢後,開始初始化web.xml中配置的Servlet。
二、Spring中的幾種設計模式?**
① 單例模式: spring的配置文件中設置bean默認爲單例模式, spring中有兩種代理方式,若目標對象實現了若干接口,spring使用jdk的類代理, 沒有實現任何接口,spring使用CGLIB庫生成目標類的子類;
② 模板方式模式——用來解決代碼重複的問題。好比:RestTemplate, 當咱們從服務消費端去調用服務提供者的服務的時候,使用了RestTemplate;
③ 前端控制器模式——spring提供了前端控制器DispatherServlet來對請求進行分發;
④ 試圖幫助(view helper)——spring提供了一系列的JSP標籤,高效宏來幫助將分散的代碼整合在試圖中;
⑤ 依賴注入——貫穿於BeanFactory/ApplacationContext 接口的核心理念;
⑥ 工廠模式——在工廠模式中, 經過使用同一個接口來指向新建立的對象。Spring中使用beanFactory來建立對象的實例。
三、bean的生命週期?**
單例對象:scope="singleton",一個應用只有一個對象的實例。它的做用範圍就是整個應用。
生命週期:
對象出生:當應用加載,建立容器時,對象就被建立了。
對象活着:只要容器在,對象一直活着。
對象死亡:當應用卸載,銷燬容器時,對象就被銷燬了。
多例對象:scope="prototype",每次訪問對象時,都會從新建立對象實例。
3.一、BeanFactory和FactoryBean的區別?
BeanFactory是IOC最基本的容器,負責生產和管理bean,它爲其餘具體的IOC容器提供了最基本的規範,FactoryBean是一個接口,當在IOC容器中的Bean實現了FactoryBean後,經過getBean(String BeanName)獲取到的Bean對象.( 並非FactoryBean的實現類對象,而是這個實現類中的getObject()方法返回的對象。)
四、Spring的經常使用註解
註解裝配在 spring 中默認是關閉的。必須在 Spring 配置文件中配置 <context:annotation-config/>元素,開啓註解裝配。
1、用於裝配Bean的註解**
@Component(value=」xxx」): 把資源讓spring來管理。至關於在xml中配置一個bean。value能夠省略,value的屬性值做爲bean的id;
@Component的三個衍生註解:
@Controller(value=」xxx」):通常用於將表現層裝配到容器中,使用方法和@Componet同樣;
@Service(value=」xxx」):通常用於將業務層裝配到容器中,使用方法和@Component同樣;
@Repository(value=」xxx」):通常用於將持久層裝配到容器中,使用方法和@Component同樣。
2、用於屬性注入的註解**
@Autowired:只能按照bean類型注入,若是有多個類型匹配,默認將屬性名稱做爲id去容器中查找;
@Qualifier:通常和@Autowired配合使用,用來注入指定id的bean,作方法的參數中能夠獨立使用;
@Resource:用來注入指定id的bean類型,至關於@Autowired+@Qualifier;
@Value:只能注入基本類型等數據,不能注入bean類型,可使用${}在資源文件中獲取數據,前提是,外部資源文件被加載。
3、做用域**
@Scope:用於指定bean的做用域,通常就是singleton和prototype
4、生命週期相關的
@PostConstruct:用於指定某一個方法爲初始化方法;
@PreDestroy:用於指定某一個方法爲銷燬方法。
5、其餘配置類相關的**
@Configuration:聲明一個類爲配置類,用於替代applicationContext.xml的;
@ComponentScan:用於開啓註解掃描的包;
@Import:用於導入其餘類的;
@PropertySource:用於加載外部資源文件的;
@Bean:用於將方法返回的bean類型的對象裝配到容器中。
6、Junit相關的**
@RunWith:用於加載配置文件,初始化spring容器的;
@ContextConfiguration:用於指定配置文件或者配置類的。
五、spring的事務傳播特性?**
① PROPAGATION_REQUIRED: 若是存在一個事務,則支持當前事務。若是沒有事務則開啓;
② PROPAGATION_SUPPORTS: 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執行;
③ PROPAGATION_MANDATORY: 若是已經存在一個事務,支持當前事務。若是沒有一個活動的事務,則拋出異常;
④ PROPAGATION_REQUIRES_NEW: 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起;
⑤ PROPAGATION_NOT_SUPPORTED: 老是非事務地執行,並掛起任何存在的事務;
⑥ PROPAGATION_NEVER: 老是非事務地執行,若是存在一個活動事務,則拋出異常;
⑦ PROPAGATION_NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。
六、HTTP/1.1與HTTP/1.0的區別?**
① 可擴展性: HTTP/1.1 在消息中增長版本號和OPTIONS方法, 它用於獲取當前URL所支持的方法。若請求成功,則它會在HTTP頭中包含一個名爲「Allow」的頭,值是所支持的方法,如「GET, POST」;
② 緩存: HTTP/1.1 在 1.0 的基礎上加入了一些 cache 的新特性;
③ 帶寬優化: HTTP/1.1中在請求消息中引入了range頭域,它容許只請求資源的某個部分;
④ 長鏈接: 在一個TCP鏈接上能夠傳送多個 HTTP 請求和響應,減小了創建和關閉鏈接的消耗和延遲。
6.一、HTTP與HTTPS有什麼區別?
HTTP是一個客戶端和服務器端請求和應答的標準, HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層區別主要以下:
① https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用;
② http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議;
③ http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443;
④ http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
七、http常見的狀態碼有哪些?
200 OK //客戶端請求成功;
301 Moved Permanently(永久移除),請求的URL已移走。Response中應該包含一個Location URL, 說明資源如今所處的位置 ;
302 found //重定向;
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解;
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用;
403 Forbidden //服務器收到請求,可是拒絕提供服務;
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL;
500 Internal Server Error //服務器發生不可預期的錯誤;
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常;
八、Mybatis的編程步驟是什麼樣的?
① 建立SqlSessionFactory
② 經過SqlSessionFactory建立SqlSession
③ 經過sqlsession執行數據庫操做
④ 調用session.commit()提交事務
⑤ 調用session.close()關閉會話
九、Redis的持久化?
①RDB 持久化:該機制能夠在指定的時間間隔內生成數據集的時間點快照, 很是適合用於進行備份, 能夠最大化 Redis 的性能;
②AOF 持久化:記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集,使用 AOF 持久化會讓 Redis 變得很是耐久, 對於相同數量的數據集而言,AOF文件一般要大於RDB文件, AOF在運行效率上每每會慢於RDB;
③無持久化:讓數據只在服務器運行時存在。
二者的區別:
RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。
AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。
9.一、Redis有哪幾種數據結構?
String——字符串,hash(鍵值對),list(列表),set(集合),zset(有序集合)
9.二、Redis常見的性能問題都有哪些?如何解決?**
(1)Master寫內存快照, 會阻塞主線程的工做;
(2)Master AOF持久化,若是不重寫AOF文件,AOF文件過大會影響Master重啓的恢復速度;
(3)Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源;
(4)Redis 主從複製的性能問題,爲了主從複製的速度和鏈接的穩定性,Slave 和 Master 最好在同一個局域網內。
9.三、redis存滿以後的解決方案?**
① 增長內存,由於redis是基於內存的k-v鍵值對存儲的,內存越大,可存儲的數據越多;
② 使用內存淘汰策略: 修改redis.conf中maxmemory-policy選項,設置刪除redis鍵的淘汰規則, redis中並不會準確的刪除全部鍵中最近最少使用的鍵,而是隨機抽取3個鍵,刪除這三個鍵中最近最少使用的鍵;
③ 集羣:設置redis主從,避免redis單點故障,構建讀寫分離架構,知足讀多寫少的應用場景, 即便有了主從複製,每一個數據庫都要保存整個集羣中的全部數據,容易造成木桶效應, 這時要用到分片集羣,全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.,客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。
十、數據庫的分庫分表?**
當數據比較大的時候,對數據進行分表操做,首先要肯定須要將數據平均分配到多少張表中,也就是:表容量。
10.一、用戶中心數據庫切分方法|範圍法
以用戶中心的業務uid爲劃分依據,將數據水平切分到兩個數據庫實例上去,user_db1存儲0到1千萬的uid數據,user_db2存儲1到2千萬的數據切分策略簡單,擴容簡單,數據量和請求量不均勻
10.二、用戶中心數據庫切分方法|哈希法
以用戶中心的業務uid爲劃分依據,將數據水平切分到兩個數據庫實例上去, user_db1存儲uid%2=0的數據,user_db2存儲uid%2=1的數據
切分策略簡單,數據量和請求量均勻,擴容麻煩,增長一個庫須要從新hash。
垂直分庫就是根據業務耦合性,將關聯度低的不一樣表存儲在不一樣的數據庫。作法與大系統拆分爲多個小系統相似,按業務分類進行獨立劃分。與"微服務治理"的作法類似,每一個微服務使用單獨的一個數據庫。