Spring面试题 2.最佳实践中,通常一个Xml映射文件都会写一个Dao接口与之对应,请问,这个Dao工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? 3.Mybatis是如何进行分页的?分页插件的原理是什么? 4.java中的9大隐式对象有哪些? 5.数据库里面的索引和约束是什么?

1.有哪些不同类型的IOC(依赖注入)方式?

1.Set 注入

2.构造器注入

3.静态工厂的方法注入

4.实例工厂的方法注入

Setter 注入:对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。

构造器注入:在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。

静态工厂的方法注入:利用静态工厂方法可以把bean注入到IOC容器中。在XML文件中配置bean时,要指定class的属性为工厂的类;factory-method属性指定工厂类中工厂方法,用于创建bean;constrctor-arg用于给工厂方法传递参数

实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时 , 只需要简单的调用该实例方法而不需要关心对象的创建细节。

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数

Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,

可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

3.Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

4.java中的9大隐式对象有哪些?

 request              请求对象                  类型 javax.servlet.ServletRequest          作用域 Request    对象主要用于处理客户端请求,在(页面转发,获取cookie)用到
  response             响应对象                   类型 javax.servlet.SrvletResponse          作用域  Page     用于处理响应客户端请求,在(页面重定向)中使用
  pageContext        页面上下文对象           类型 javax.servlet.jsp.PageContext         作用域    Page    用于获取页面的上下文,通过此对象可以获取页面的其他8个内置对象
  session              会话对象                   类型 javax.servlet.http.HttpSession          作用域    Session    在网络中被称为会话,一个会话就是浏览器与服务器之间的一次通话(保存登录状态时)
  application          应用程序对象             类型 javax.servlet.ServletContext            作用域    Application  就像全局变量,用于保存应用程序中的共有数据(上传时获取真实路径)
  out                    输出对象                   类型 javax.servlet.jsp.JspWriter             作用域    Page      对象用于在web浏览器内输出信息,数据输出完,要及时关闭输出流
  config                 配置对象                   类型 javax.servlet.ServletConfig             作用域    Page    用于取得服务器的配置信息
  page                 页面对象                   类型 javax.lang.Object                       作用域    Page    代表jsp本身,只有在jsp页面内才是合法的
  exception            例外对象                   类型 javax.lang.Throwable                    作用域    page     用于处理jsp页面发生的异常

5.数据库里面的索引和约束是什么?

索引是最为常用的改善数据库性能的技术。SQL Server引入索引主要是为了提高查询的效率,它能够加速ORDER BY和GROUP BY子句的操作,保证数据的唯一性,并加快表连接的速度

约束设计数据库完整性的目的是为了防止数据库存在不符合语义的数据,防止错误信息的输入和输出。SQL Server提供的用来实施数据完整性的途径主要是约束(Constraint)、标识列(Identity Column)、默认(Default)、规则(Rule)、触发器(Trigger)、数据类型(Data Type)、索引(Index)和存储过程(Stored Procedure)等