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