谈谈你对struts的理解
1.structs本质就是一个servlet,而这个servlet就是ActionServlet或是其子类,即将所有请求都交给servlet去处理,而该servlet参考配置文件将请求分发给不同action处理
2.在把请求交给action之前,会将参数封装成一个frombean对象,而该对象只有通过validate方法,才能将对象传递给execute方法,否则将返回一个错误页面,并且这个页面由input属性指定
3.action执行完之后要返回显示的结果视图,这个结果一个actionForward来表示,而其是通过在struts配置文件中配置获得返回页面
谈谈struts的优缺点
优点:
1.实现mvc模式,结构清晰,使开发者只关注业务逻辑的实现
2有丰富的tag可以使用,大大提高开发效率
3.页面导航使系统的脉络更加清晰
4.提供Exception处理机制
缺点:
1.structs的action是一种thread-safe方式,它仅仅允许一个实例处理所有的请求。容易引起线程安全问题
2 测试不方便。struts的每个action都同web层耦合在一起,这样它的测试依赖于web容器,单元测试很难实现
3.对servlet的依赖性过强,struts处理action时必须依赖servletRequest和servletRespouse,所以它摆脱不了servlet容器
谈谈你对hibernate的理解
1.使用hibernate的基本流程:配置Configuration对象、产生sessionfactory、创建session对象、启动事务,完成CRUD操作,提交事务,关闭session
2.使用hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言,还要为每个实体配置相应的hbm.xml文件
3.在应用hibernate时,重点要了解session的缓存原理,级联,延迟加载和hql语句
介绍一下hibernate的二级缓存
回答思路:1.首先说清楚什么是缓存
2.再说有了hibernate的session就是一级缓存,即有了一级缓存,为什么还要有二级缓存
3.最后说如何配置hibernate的二级缓存
1.缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中,这个数据结构通常类似于hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用
2.hibernate的session就是一级缓存,当想要使用session从数据库中查询出的一个对象时,session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在则查询数据库
由于session代表依次会话,一个session与一个数据库连接的相关性,通常仅用一个事务,用完就关闭,由于一级缓存是线程不安全的,要被多个线程共享,而二级缓存是全局缓存,可以被多个线程和事务共享
3二级缓存是独立于hibernate的软件部件,如ehcache
hibernate中sessionFactory是线程安全吗?session是线程安全的吗
sessionfactory对应一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。一般在启动的时候通过单例模式进行封装便于访问
session是一个轻量级的非线程安全的对象,线程间不能共享session,session默认会延迟获取数据库连接
简单说一下mybatis的一级缓存和二级缓存
mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从从缓存取出返回结果集。mybatis内部缓存使用一个hashmap,key为hashcode+sqlid+sql语句。value从查询出来映射生成java对象
mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中存取数据,二级缓存是可以跨sqlsession的
mybatis中的动态SQL是什么意思
动态sql主要包括if、choose、when、otherwise、trim、where、set、foreach
mybatis和hibernate有什么不同
相同点:
都屏蔽了jdbc api底层访问细节,编程流程固定,还将sql语句与java代码混杂在一起
不同点
半自动,将sql语句与代码进行分离,提供了将结果集自动封装成为实体对象和对象集合的功能
全自动,hibernate,提供hql语句
谈谈你对spring的理解
1.spring是实现了工厂模式的工厂类,这个类为beanFactory,通常为其子类applicationContext,spring相当于一个大的工厂类,在其配置文件中通过元素配置用于创建实例对象名和实例对象的属性
2.spring提供了对IOC的良好支持,利用IOC可以很好的实现模块间的解耦
3.spring提供了对AOP技术的良好封装,即把系统中很多不相干的类的方法,在这些众多的方法中加入某种系统功能的代码,例如,加入日志,权限判断,异常处理等等,称为AOP
4实现AOP采用代理类,在jdk中采用proxy类产生动态代理的方式为某个接口生成实现类
使用spring框架的好处是什么
轻量级、控制反转、面向切面编程(AOP)、容器(包含并管理应用中对象的生命周期和配置)、mvc框架、事务管理、异常处理
什么是spring的依赖注入?有哪些方法进行依赖注入?
你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件和服务,之后一个容器负责把他们组装起来
构造器依赖注入、setter方法注入
解释spring框架中bean的生命周期
1.spring容器从XML文件中读取bean的定义,并实例化bean
2.spring根据bean的定义填充所有的属性
3.如果bean实现了beanNameAware接口,spring传递bean的ID到setBeanName方法
4.如果Bean实现了BeanFactoryAware接口,spring传递beanfactory给setBeanFactory
5.如果有任何与bean相关联的beanpostprocessors,spring会在postprocesserBeforeInitalzation()方法内部调用他们
6.如果bean实现了intialzingBean了,调用它的afterPropertySet方法,如果bean声明初始化方法,调用此初始化方法
7.如果bean实现了disposableBean,它将调用destroy()方法