面试题
1.有哪些不同类型的IOC(依赖注入)方式?解释说下
1.Set 注入
2.构造器注入
3.静态工厂的方法注入
4.实例工厂的方法注入
Setter 注入:对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
静态工厂的方法注入:利用静态工厂方法可以把bean注入到IOC容器中。在XML文件中配置bean时,要指定class的属性为工厂的类;factory-method属性指定工厂类中工厂方法,用于创建bean;constrctor-arg用于给工厂方法传递参数
实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时 , 只需要简单的调用该实例方法而不需要关心对象的创建细节。
2.最佳实践中,通常一个Xml映射文件都会写一个Dao接口与之对应,请问,这个Dao工作原理是什么?
Dao接口里的方法,参数不同时,方法能重载吗?
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 response session application out page config exception pageContent
====================================================================
request
====================================================================
request.getParameter();获得用户提交的表单信息
request.setCharacterEncoding("UTF-8");设置请求编码,防止乱码
request.setAttribute("Unmae", new Object());将数据保存到request范围内的变量中
request.forward(String Url);转发
request.getRequestURL();获得当前页的IE地址
request.getHeader("resref");获得请求也的IE地址
request.getRemoteAddr();获得用户的IP地址
====================================================================
cookie
====================================================================
cookie.getCookies()获得所有cookie对象的集合
cookie.getName()获得指定名称的cookie
cookie.getValue()获得cookie对象的值
URLEncoder.encode();将需要保存到cookie中的数据进行编码
URLEncoder.decode();读取cookie信息时将信息解码
====================================================================
response
====================================================================
response.addCookie()将一个cookie对象发送到客户端
response.sendRedirect(String path); 重定向
====================================================================
application
====================================================================
application.setAttribute(key,value);给application添加属性值
application.getAttribute(key,value);获取指定的值
====================================================================
session
====================================================================
session.setMaxInactiveInterval(int num);设置session对象的有效活动时间
session.isNew();判断是否为新用户 返回Boolean
session.setAttribute();
session.getAttribute();
session.invalidate();销毁当前session
5.数据库里面的索引和约束是什么?
索引是最为常用的改善数据库性能的技术。SQL Server引入索引主要是为了提高查询的效率,它能够加速ORDER BY和GROUP BY子句的操作,保证数据的唯一性,并加快表连接的速度
约束设计数据库完整性的目的是为了防止数据库存在不符合语义的数据,防止错误信息的输入和输出。SQL Server提供的用来实施数据完整性的途径主要是约束(Constraint)、标识列(Identity Column)、默认(Default)、规则(Rule)、触发器(Trigger)、数据类型(Data Type)、索引(Index)和存储过程(Stored Procedure)等