实习电话面试遇到到一些问题(一)

1.Spring的注入方式
当使用byType时,如果容器中存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。

2.判断两个类是否存在继承关系

1、instanceOf关键字,用来判断对象是否是类的实例
2、isAssignableFrom,用来判断类型间是否存在派生关系
3、isInstance方法,用来判断对象是否属于某个类型的实例

Class clazzB = B.class;  
Class clazzD = D.class;  
boolean isFather = clazzD.isAssignableFrom(clazzB));  
if(isFather){  
 System.out.println("D是B的父类");  
}else{  
 System.out.println("D不是B的父类");  
}  
        System.out.println(new B() instanceof A);
        System.out.println(new A() instanceof B);
System.out.println(A.class.isInstance(new B()));

3.JDK1.8为什么把运行时常量池移入堆中?永久代被移除,元空间取代

  1、字符串存在永久代中,容易出现性能问题和内存溢出。
  2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
  3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
  4、Oracle 可能会将HotSpot 与 JRockit 合二为一

4.mybatis中的#和$的区别

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现

select * from user where name = #{name}; 

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?; 

那么我们使用 ${}的时候

select * from user where name = ${name}; 

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "dato"; 

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上所得 ,$ 变量的替换阶段是在动态 SQL 解析阶段,而 #变量的替换是在 DBMS 中。

#方式能够很大程度防止sql注入。
S方式无法防止Sql注入。
S方式一般用于传入数据库对象,例如传入表名.
一般能用#的就别用 S{}.
所以我们在使用mybatis的时候,尽量的使用#方式

5.mybatis 中修改sql语句需要重启吗 ?

需要重启,所有的配置文件修改了都要重启。修改了java文件需要重新编译。修改了页面不需要重启 。

你可能感兴趣的:(面试)