java框架问题整理

1.Spring中AOP的应用场景、Aop原理、好处?

答:AOP用来封装横切关注点,具体可以在下面的场景中使用:

Authentication 权限、Caching 缓存、Context passing 内容传递、Error handling 错误处理

Lazy loading懒加载、Debugging调试、logging, tracing, profiling and monitoring 记录跟踪优化 校准、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务

面向方面的程序设计(Aspect-Oriented Programming)

原理:AOP是面向切面编程,是通过代理的方式为程序添加统一功能,集中解决一些公共问题。

好处:1.各个步骤之间的良好隔离性

2.源代码无关性

2.Spring中IOC的作用与原理?对象创建的过程。

答:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 。

3.介绍spring框架

它是一个full-stack框架,提供了从表现层到业务层再到持久层的一套完整的解决方案。我们在项目中可以只使用spring一个框架,它就可以提供表现层的mvc框架,持久层的Dao框架。它的两大核心IoC和AOP更是为我们程序解耦和代码简洁易维护提供了支持。

4.Spring常见创建对象的注解?

答:@Component@Controller@ Service@ Repository

5.Spring中用到的设计模式

答:简单工厂、工厂方法、单例模式、适配器、包装器、代理、观察者、策略、模板方法

详细介绍:http://www.cnblogs.com/yuefan/p/3763898.html

6.Spring的优点?

答:1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦

2.可以使用容易提供的众多服务,如事务管理,消息服务等

3.容器提供单例模式支持

4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

5.容器提供了众多的辅助类,能加快应用的开发

6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

7.spring属于低侵入式设计,代码的污染极低

8.独立于各种应用服务器

9.spring的DI机制降低了业务对象替换的复杂性

10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部

7.Spring Bean的作用域之间有什么区别?

Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:

singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

全局作用域与Servlet中的session作用域效果相同。

8.Spring管理事务有几种方式?

答:有两种方式:

1、编程式事务,在代码中硬编码。(不推荐使用)

2、声明式事务,在配置文件中配置(推荐使用)

声明式事务又分为两种:

a、基于XML的声明式事务

b、基于注解的声明式事务

9.spring中自动装配的方式有哪些?

答:1、 No:即不启用自动装配。

2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。

3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。

4、 constructor:同byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造器注入。

5、 autodetect:在byType和constructor之间自动的选择注入方式。

6、 default:由上级标签<beans>的default-autowire属性确定。

10.spring中的核心类有那些,各有什么作用?

答:BeanFactory:产生一个新的实例,可以实现单例模式

BeanWrapper:提供统一的get及set方法

ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

11.Bean的调用方式有哪些?

答:有三种方式可以得到Bean并进行调用:

1、使用BeanWrapper

HelloWorld hw=new HelloWorld();

BeanWrapper bw=new BeanWrapperImpl(hw);

bw.setPropertyvalue(”msg”,”HelloWorld”);

system.out.println(bw.getPropertyValue(”msg”));

2、使用BeanFactory

InputStream is=new FileInputStream(”config.xml”);

XmlBeanFactory factory=new XmlBeanFactory(is);

HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);

system.out.println(hw.getMsg());

3、使用ApplicationContext

ApplicationContext actx=new FileSystemXmlApplicationContext(”config.xml”);

HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);

System.out.println(hw.getMsg());

12.什么是IOC,什么又是DI,他们有什么区别?

答:依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个 数据库连接以参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖。

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

13.spring有两种代理方式:

答: 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。

优点:因为有接口,所以使系统更加松耦合

缺点:为每一个目标类创建接口

若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。

缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

14.springMVC的流程?

答:1.用户发送请求至前端控制器DispatcherServlet

2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

5.执行处理器(Controller,也叫后端控制器)。

6.Controller执行完成返回ModelAndView

7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器

9.ViewReslover解析后返回具体View

10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

11.DispatcherServlet响应用户

15.Springmvc的优点

答:1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.

2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)

3. 可以任意使用各种视图技术,而不仅仅局限于JSP

4 . 支持各种请求资源的映射策略

5 .它应是易于扩展的

16.Struts2的流程?

答:1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3.接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来解析和判断该次请求是否需要由struts2框架来处理.

4.如果ActionMapper判断需要struts2来处理请求,StrutsPrepareAndExecuteFilter会把请求的处理交给ActionProxy

5 .ActionProxy通过Configuration Manager加载框架的配置文件,找到需要调用的Action以及拦截器配置信息

6 .ActionProxy创建一个ActionInvocation的实例。

7 .ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果配置。根据配置找到对应的Result处理类来处理结果集.大多数情况输出会交由模版语言(JSP,FreeMarker)完成输出内容拼装

17.struts2中有哪些常用结果类型?

答:1) dispatcher :Action 转发给 JSP

2) chain :Action转发到另一个Action (同一次请求)

3) redirect : Action重定向到 JSP

4) redirectAction :Action重定向到另一个Action

stream:下载用的(文件上传和下载时再议)

plainText:以纯文本的形式展现内容

18.struts2的Action有几种编写方式?

答:第一种 创建类,这个类不继承任何类,不实现任何的接口

第二种 创建类,实现接口 Action接口

第三种 创建类,继承类 ActionSupport类,ActionSupport类是Action接口的实现类

19.使用struts2如何实现多文件上传?

答:1第一步 上传表单页面,满足三个要求,提交到action里面,要求:多个文件上传项name属性值必须要一样

2创建action,在action实现多文件的上传,在action中使用数组形式得到多个文件的息

private File[] uploadImages;//得到上传的文件

private String[] uploadImagesContentType;//得到文件的类型

private String[] uploadImagesFileName;//得到文件的名称

3遍历数组,得到每一个文件的信息,一个一个上传到服务器中

if(uploadImages!=null&&uploadImages.length>0){

for(int i=0;i<uploadImages.length;i++){

File destFile = new File(realpath,uploadImageFileNames[i]);

FileUtils.copyFile(uploadImages[i], destFile);

}

}

20.springMVC与Struts2的区别?

答: 1.springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

2.springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

3.Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数

解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

21.如何防止表单重复提交?表单重复提交的原因?

答:令牌机制。

原因:1.服务器处理服务后,转发页面,客户端点击刷新(重定向)

2.客户端网络过慢,按钮连续点击。

22.hibernate原理?

答: hibernate,通过对jdbc 进行封装,对java 类和 关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的jdbc + sql 操作数据的方式,从而使开发人员可以话更多精力进行对象方面的开发

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory

3.打开Sesssion

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory

23.hibernate的优点?

答:1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2.Hibernate 是一个基于JDBC 的主流持久化框架,是一个优秀的ORM 实现。他很大程度

的简化DAO 层的编码工作

3.hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各

种关系数据库,从一对一到多对多的各种复杂关系。

24.什么是 Hibernate 延迟加载?

答:延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要

数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及

对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

25.Hibernate 中类之间的关联关系有几种?

答:many-to-one、one-to-many、many-to-many、 one-to-one

26.说下 Hibernate的缓存机制

答:A:hibernate一级缓存

(1)hibernate支持两个级别的缓存,默认只支持一级缓存;

(2)每个Session内部自带一个一级缓存;

(3)某个Session被关闭时,其对应的一级缓存自动清除;

B:hibernate二级缓存

(1) 二级缓存独立于session,默认不开启;

27.Hibernate 的查询方式

答:本地SQL查询、Criteria、Hql

28.如何优化 Hibernate?

答:1.使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

29.Hibernate中一级缓存与二级缓存

答:Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存

Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。需要程序员手动开启。

30.Hibernate中关于对象的三种状态?

答:瞬时态(没有主键,new出来的)、持久态(session开启,有主键)、隔离态(session关闭,有主键)。

31.Hibernate二级缓存中存放数据的原则?适合放到二级缓存中的数据?

答:1 很少被修改的数据   

2 不是很重要的数据,允许出现偶尔并发的数据   

3 不会被并发访问的数据   

4 常量数据   

不适合存放到第二级缓存的数据?   

1经常被修改的数据   

2绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   

3与其他应用共享的数据

32.Hibernate查找对象如何应用缓存?

答:当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存删除、更新、增加数据的时候,同时更新缓存。

33.Hibernate拒接连接、服务器崩溃的原因?

答:1. db没有打开

2. 网络连接可能出了问题

3. 连接配置错了

4. 驱动的driver,url是否都写对了

5. LIB下加入相应驱动,数据连接代码是否有误

6. 数据库配置可能有问题

7. 当前连接太多了,服务器都有访问人数限制的

8. 服务器的相应端口没有开,即它不提供相应的服务

34.过滤器和拦截器的区别

答:过滤器:在目标资源之前进行的操作

过滤所有的内容,比如action、servlet、jsp、html

拦截器:在目标资源之前进行的操作

不能拦截所有的内容,拦截action,不能拦截jsp,不能拦截html

拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别。其主要区别为以下几点:

1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的。

2)拦截器依赖于Servlet容器,而过滤器依赖于Servlet容器

3)拦截器只能对Action请求起作用,而过滤器可以对几乎所有的请求起作用。

4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能

5)在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

35.Mybaties的优劣势?

答:1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

2. 可以进行更为细致的SQL优化,可以减少查询字段。

3. 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

4. 二级缓存机制不佳

36.Mybatis中一级缓存与二级缓存区别?

答:一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

  一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。

  二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

  二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。

37.Ssh整合流程及注意事项

答:原理:http://blog.csdn.net/u014010769/article/details/44993533

注意事项:http://blog.csdn.net/github_32658299/article/details/53469124

38.Ssm整合流程及注意事项?

答: 流程:http://blog.csdn.net/zhshulin/article/details/37956105/

注意事项:http://blog.csdn.net/github_32658299/article/details/53957585

39.ssm的优缺点及使用场景。

答:1.Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

2.Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

3.Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

40.Hibernate和mybatis的区别?

答:Hibernate:hibernate是一个标准的ORM框架,不需要写sql语句,维护关系比较复杂,sql语句自动生成,对sql语句优化,修改比较困难。

Hibernate的优缺点:

优点:面向对象开发,不需要自己写sql语句。如果进行数据库迁移不需要修改sql语句,只需要修改一下方言。

缺点:hibernate维护数据表关系比较复杂。完全是有hibernate来管理数据表的关系,对于我们来说完全是透明的,不易维护。

Hibernate自动生成sql语句,生成sql语句比较复杂,比较难挑错。

Hibernate由于是面向对象开发,不能开发比较复杂的业务。

应用场景:

适合需求变化较少的项目,比如ERP,CRM等等

Mybatis框架对jdbc框架进行封装,屏蔽了jdbc的缺点,开发简单。

Mybatis只需要程序员关注sql本身,不需要过多的关注业务。对sql的优化,修改比较容易

适应场景:适合需求变化多端的项目,比如:互联网项目

41.用spring怎样实现单例?

答:http://blog.csdn.net/cs408/article/details/48982085

42.Spring事务传播机制和数据库隔离级别

答:http://www.cnblogs.com/sxl525blogs/p/3674834.html

43.mybatis如何处理批量插入

答:http://chenzhou123520.iteye.com/blog/1583407/

44.mybatis插入一条数据如何返回主键

答:需要在mybatis的mapper.xml中指定keyProperty属性,示例如下:

45.hibernate的五个核心类

答:1,Configuration接口:配置Hibernate,根据其启动Hibernate,创建SessionFactory对象;

2,SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建session对象,SessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级二级缓存;

3,session接口:负责保存、更新、删除、加载和查询对象,是一个非线程安全的,避免多个线程共享一个session,是轻量级,一级缓存。

4,Transaction接口:管理事务。可以对事务进行提交和回滚;

5,Query和Criteria接口:执行数据库的查询。

46.spring和hibernate管理事务有啥区别

答:1、从编码上说,hibernate的事务管理是硬编码,是写在程序之中的。这就造成了,如果需要调整,就要修改源码,重新编译。

2、从事务控制的位置来说:hibernate是持久层框架,事务是控制在持久层的,这样就造成了越权操作。事务应放在业务层,而非持久层

3、从代码维护上来说:hibernate控制事务,需要在每个需要事务支持的地方编写代码,后期维护不便。