JAVA面試總結

1.string的類可否被繼承?     答:不能,由於string類是final修飾的,不能夠被繼承。html

知識點:final在java中有什麼做用:java

● final修飾的類叫最終類,該類不能被繼承spring

● final修飾的方法不能被重寫springboot

● final修飾的變量叫常量,常量必須初始化,初始化以後值就不能被修改.net

2.springboot的啓動原理是什麼? 很難,之後有時間再看看設計

3.反射機制在spring容器中ioc(控制面板)中的應用代理

    IOC:即「控制反轉」,不是什麼技術,而是一種思想。使用IOC意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。code

<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

    那麼經過這樣配置,Spring是怎麼幫咱們實例化對象,而且放到容器中去了了?對,就是經過反射!!!xml

    下面是Spring經過配置進行實例化對象,並放到容器中的僞代碼:htm

//解析<bean .../>元素的id屬性獲得該字符串值爲「courseDao」  
String idStr = "courseDao";  
//解析<bean .../>元素的class屬性獲得該字符串值爲「com.qcjy.learning.Dao.impl.CourseDaoImpl」  
String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";  
//利用反射知識,經過classStr獲取Class類對象  
Class<?> cls = Class.forName(classStr);  
//實例化對象  
Object obj = cls.newInstance();  
//container表示Spring容器  
container.put(idStr, obj);

    經過解析xml文件,獲取到id屬性和class屬性裏面的內容,利用反射原理獲取到配置裏面類的實例對象,存入到Spring的bean容器中

    當一個類裏面須要應用另外一類的對象時,Spring的配置以下所示:

<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">  
     <!-- 控制調用setCourseDao()方法,將容器中的courseDao bean做爲傳入參數 -->  
     <property name="courseDao" ref="courseDao"></property>  
</bean>

    咱們繼續用僞代碼的形式來模擬實現一下Spring底層處理原理:

//解析<property .../>元素的name屬性獲得該字符串值爲「courseDao」  
String nameStr = "courseDao";  
//解析<property .../>元素的ref屬性獲得該字符串值爲「courseDao」  
String refStr = "courseDao";  
//生成將要調用setter方法名  
String setterName = "set" + nameStr.substring(0, 1).toUpperCase()  
        + nameStr.substring(1);  
//獲取spring容器中名爲refStr的Bean,該Bean將會做爲傳入參數  
Object paramBean = container.get(refStr);  
//獲取setter方法的Method類,此處的cls是剛纔反射代碼獲得的Class對象  
Method setter = cls.getMethod(setterName, paramBean.getClass());  
//調用invoke()方法,此處的obj是剛纔反射代碼獲得的Object對象  
setter.invoke(obj, paramBean);

經過上面對Spring底層原理的分析,能夠發現,其實並不難,用到的都是反射機制,經過反射實例化對象,存入到Spring的bean容器中。

只要在代碼或配置文件中看到類的完整路徑(包.類),其底層原理基本上使用的就是Java的反射機制。

3.代理模式在spring aop的應用

    https://www.cnblogs.com/teach/p/10763845.html

相關文章
相關標籤/搜索