JAVA基礎面試題二

1.簡單介紹一下Spring

Spring是一個開源框架,主要目的是簡化企業開發!它的核心部分爲IOC(控制反轉)和Aop(面向切面編程);使用Spring可以降低各個組件間的耦合度,他對主流的應用框架如:SpringMvc、MyBatis、Strtus2等提供了很好的集成,簡化了開發步驟。

2.理解IOC和AOP

1.IOC:控制反轉,將原本手動new 對象的權力交給Spring工廠,由Spring工廠來負責實例化對象以及維護對象與對象之間的依賴關係。

2.AOP:在原本的OOP編程中,不可避免會有很多重複代碼,或者代碼與代碼之間的強耦合性,SpringAOP很好的解決了這樣的問題,他使用動態代理,動態獲取目標類對象,反射執行方法,爲目標方法提供了一個可拔插的選項,避免了代碼冗餘和代碼與代碼之間的強耦合。

3.你瞭解動態代理嗎

再Spring中實施了兩種代理模式,即Cglib和jdk代理模式。

1.JDK代理:JDK的動態代理必須指定接口,這些接口都是已經被代理對象實現了的

2.CGLIB代理:CGLIB代理不需要指定接口

4.JDK動態代理的實現方式

基於JDK的動態代理需要實現InvocationHandler接口,通過類加載器Class.ClassLocald(),獲取類對象,反射invoke()執行目標方法,缺點是隻能基於接口進行代理

5.CGLIB動態代理的實現思路

基於CGLIB動態代理的方式,方法需要實現MethodInterceptor接口,覆蓋intercept方法,通過參數methodProxy的methodProxy.invokeSuper(Object methodName,Object[] args)方法執行方法;他可以不用依賴於接口執行:

缺點:他不能代理find方法

代理模式詳解

6.SpringBean工廠的實例化步驟

1.加載配置文件或者配置類(重點)

2.通過BeanID找到類的全限定名,反射加載對象(重點)

3.判斷對象是否設置爲了單例模式,如果是單例模式直接返回(重點)

4.執行依賴檢查,防止循環依賴

5.如果存在依賴對象(注入對象),則進行遞歸創建,反射賦值到對應的屬性上。

6.返回Bean實例

7.什麼是單例模式

他是一種設計模式,一個類只有一個實例,能夠自行初始化,並且向系統提供全局的訪問接口

8.單例模式實現原理

單例模式比較流行的分爲懶漢式和餓漢式

8.1 :單例模式懶漢式速記

​ 首先先私有化無參構造防止外部手動實例化!

​ 突出一個懶字,每一次用的時候纔會去判斷是不是爲null,爲null就創建對象,不爲null就直接返回,不用就不判斷!懶

package com.singlecase;

import org.apache.poi.ss.formula.functions.T;

/**
 * 傳說中的懶漢式單例
 * 每一次等到用的時候纔會判斷它是否已經實例化了  所以說它懶啊
 * @author 皇甫
 */
public class LazySingleCase {
    private static LazySingleCase lazySingleCase;

    /**
     * 私有化構造函數 不讓用戶手動創建只能被動獲取
     */
    private LazySingleCase(){}

    /**
     * 提供返回對象的方法
     * @return
     */
    public static LazySingleCase getInstance() throws InterruptedException {
        //用的時候纔會去判斷是不是爲null
        if(lazySingleCase == null){
            lazySingleCase = new LazySingleCase();
        }
        return lazySingleCase;
    }
}

8.2:單例模式餓漢式速記

​ 設置私有的靜態的成員對象,JVM保證,靜態屬性只被加載一次

​ 首先先私有化無參構造防止外部手動實例化!

​ 重點突出一個餓字,不管你能不能使用,我都會創建對象,static特點;因爲餓,所以看見就吃,不管好 不好吃,因爲餓,所以看見就創建不管用不用的上!

package com.singlecase;

/**
 * 餓漢式單例模式
 * @author 皇甫
 */
public class HungryChineseSingleCase {
    /**
     * 靜態成員變量
     */
    private static HungryChineseSingleCase hungryChineseSingleCase = new HungryChineseSingleCase();
    
    private HungryChineseSingleCase(){}

    /**
     * 直接返回實例
     * @return
     */
    public static HungryChineseSingleCase getInstance(){
        return hungryChineseSingleCase;
    }
}

9.單例模式的懶漢式和餓漢式的優缺點

懶漢式 :節省空間,但是線程不安全

餓漢式:線程安全,但是不節省空間

單例模式詳解

10.簡單描述一下SpringMVC的執行流程

在這裏插入圖片描述

首先需要了解一點,再SpringMVC容器進行初始化的時候,會遍歷所有的帶有@Controller的類,將類裏面的方法與@RequestMapping("xxxxx")的值做Map映射 Map<String,Method>,比如

@Controller
public class userController{
    @RequestMapping("/user/findAll")
    public List<User> findAllUser(){
        return new ArrayList<User>();
    }
}

模擬以上方法,它在容器初始化時Map映射爲**("/user/findAll"---------->findAllUser)**

執行步驟如下:

1.客戶端發送請求被DispathcherServlet攔截,發送給處理映射器(Handler Mapping),會根據url查詢Map集合,返回Method對象,返回給DispathcherServlet

2.DispathcherServlet將方法對象給處理器映射器(Handler Adapter),執行Method.invoke()方法,返回ModeAndView給處理器映射器(Handler Adapter),再次將ModeAndView返回給DispathcherServlet

3.DispathcherServlet將試圖對象(ModeAndView)傳遞給視圖解析器(view Resolver),返回視圖信息給DispathcherServlet

4…DispathcherServlet將視圖信息返回給客戶端

喜歡這篇文章的小夥伴,請識別下方二維碼關注本公衆號,小編不定期贈送免費的學習資源哦
在這裏插入圖片描述
關注公衆號,我會不定期贈送各種java學習資源
在這裏插入圖片描述
下面是我的個人微信號,歡迎叨擾!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章