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的應用