开发框架基础

Strutshtml

谈谈你对Struts的理解。前端

答:java

1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。咱们能够在web.xml文件中将符合某种特征的全部请求交给这个Servlet处理,这个Servlet再参照一个配置文件(一般为/WEB-INF/struts-config.xml)将各个请求分别分配给不一样的action去处理。mysql

一个扩展知识点:struts的配置文件能够有多个,能够按模块配置各自的配置文件,这样能够防止配置文件的过分膨胀;web

2.ActionServlet把请求交给action去处理以前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每一个属性对应一个请求参数),封装成一个什么样的formbean对象呢?看配置文件。面试

3.要说明的是, ActionServlet把formbean对象传递给action的execute方法以前,可能会调用formbean的validate方法进行校验,只有校验经过后才将这个formbean对象传递给action的execute方法,不然,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)做者为何将这里命名为input属性,而不是error属性,咱们后面结合实际的运行效果进行分析。正则表达式

4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象经过struts-config.xml配置文件中的配置关联到某个jsp页面,由于程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样能够实现action程序代码与返回的jsp页面名称的解耦。spring

 

 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||sql

本身的话简介Struts2执行流程数据库

Struts 2的工做流程与WebWork框架基本相同,因此说Struts2是WebWork的升级版本。

基本简要流程以下:一、客户端浏览器发出HTTP请求。二、根据web.xml配置,该请求被FilterDispatcher接收。三、根据struts.xml配置,找到须要调用的Action类和方法,并经过IoC方式,将值注入给Aciton。四、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。五、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。六、返回HTTP响应到客户端浏览器。

****************************************************************************************************

 

Struts2的工做机制

 一个请求在Struts2框架中的处理大概分为如下几个步骤:

一、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

二、这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin);

三、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否须要调用某个Action;

四、若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

五、ActionProxy经过ConfigurationManager询问框架的配置文件,找到须要调用的Action类;

六、ActionProxy建立一个ActionInvocation的实例。

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

八、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果一般是(但不老是,也多是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程当中可使用Struts2框架中继承的标签。在这个过程当中须要涉及到ActionMapper。

****************************************************************************************************

Struts2的体系结构

Struts 2框架自己大体能够分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器 FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是须要用户来本身实现的。用户在开发Action和业务逻辑组件的同时,还须要编写相关的配置文件,供核心控制器FilterDispatcher来使用。

 

Struts2的体系与Struts1体系的差异很是大,由于Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而容许用户的业务逻辑控制器与Servlet API分离。

  Struts2框架的大概处理流程以下:

  一、加载类(FilterDispatcher)

  二、读取配置(struts配置文件中的Action)

  三、派发请求(客户端发送请求)

  四、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action)

  五、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)

  六、处理业务(回调Action的execute()方法)

  七、返回响应(经过execute方法将信息返回到FilterDispatcher)

  八、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROR,将跳转到哪一个jsp页面)

    九、响应用户(jsp--->客户浏览器端显示)

   十、struts2标签库(相比struts1的标签库,struts2是大大增强了,对数据的操做功能很强大)

 

****************************************************************************************************

在Struts2中怎样把请求分发给方法去处理

 答:在struts.xml中就只须要配置一个action,在一个Action类中分发Action请求调用不一样的方法。

****************************************************************************************************

介绍一下Struts的ActionServlet类

 

ActionServlet继承自javax.servlet.http.HttpServlet类,其在Strutsframework中扮演的角色是中心控制器。它提供一个中心位置来处理所有的终端请求。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。
按照Servelt的标准,全部得Servlet必须在web配置文件(web.xml)声明。一样,ActoinServlet必须在WebApplication配置文件(web.xml)中描述,有关配置信息以下。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
所有的请求URI以*.do的模式存在并映射到这个servlet,其配置以下:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
一个该模式的请求URI符合以下格式:http://www.my_site_name.com/mycontext/actionName.do

当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器ActionServlet,一旦控制器得到了请求,其就会将请求信息传交给一些辅助类(helpclasses)处理。这些辅助类知道如何去处理与请求信息所对应的业务操做。在Struts中,这个辅助类就是org.apache.struts.action.Action。一般开发者须要本身继承Aciton类,从而实现本身的Action实例。

 

Struts2中常见的拦截器有哪些?

 答:上传,重复提交,数字转换,表单认证,国际化,等等

****************************************************************************************************

请简述Struts2中自定义拦截器的步骤

答:1.首先要实现Interceptor(拦截器)接口  2.在配置文件中定义本身的拦截器。  3.最后还要把系统提供的默认拦截器加上,不然系统默认拦截器不起做用

****************************************************************************************************

怎样实现Struts2自定义转换器? 

答:实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),经过继承该实现类来实现本身的类型转换器。重写convertValue方法便可。

 

说说struts1与struts2的区别。

1.都是MVC的WEB框架,

2struts1的老牌框架,应用很普遍,有很好的群众基础,使用它开发风险很小,成本更低!struts2虽然基于这个框架,可是应用群众并多,相对不成熟,未知的风险和变化不少,开发人员相对很差招,使用它开发项目的风险系数更大,用人成本更高!

3.struts2毕竟是站在前辈的基础设计出来,它会改善和完善struts1中的一些缺陷,struts1中一些悬而未决问题在struts2获得了解决。

4.struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。

5.struts1的action须要继承Action类,struts2的action能够不继承任何类;struts1对同一个路径的全部请求共享一个Action实例,struts2对同一个路径的每一个请求分别使用一个独立Action实例对象,全部对于struts2的Action不用考虑线程安全问题。

6.在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。

7.struts1中的多个业务方法放在一个Action中时(即继承DispatchAction时),要么都校验,要么都不校验;对于struts2,能够指定只对某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么则只对Xxx()方法进行校验。

(一个请求来了的执行流程进行分析,struts2是自动支持分模块开发,并能够不一样模块设置不一样的url前缀,这是经过package的namespace来实现的;struts2是支持多种类型的视图;struts2的视图地址能够是动态的,即视图的名称是支持变量方式的,举例,论坛发帖失败后回来还要传递boardid。视图内容显示方面:它的标签用ognl,要el强大不少,在国际化方面支持分模块管理,两个模块用到一样的key,对应不一样的消息;)

与Struts1不一样,Struts2对用户的每一次请求都会建立一个Action,因此Struts2中的Action是线程安全的。

给我印象最深入的是:struts配置文件中的redirect视图的url不能接受参数,而struts2配置文件中的redirect视图能够接受参数。

 

Struts2怎样整合spring?

 答:1.使用向导添加struts2的组件;

    2.使用向导添加spring2.5的组件;   

                                              struts.properties            --指定有Struts2的action由spring容器管理

                                           web.xml                      --指定spring容器配置文件  

                                              globalMessages.properties     --非必须有   

                                              struts.xml                   --class属性配置改为spring容器内bean的ID

                                            applicationContext.xml        --action的做用域须要是原型

****************************************************************************************************

Spring

****************************************************************************************************

spring是什么?

spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程)

****************************************************************************************************

你对Spring的理解。

1.Spring实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为BeanFactory(其实是一个接口),在程序中一般BeanFactory的子类ApplicationContext。Spring至关于一个大的工厂类,在其配置文件中经过<bean>元素配置用于建立实例对象的类名和实例对象的属性。

2.Spring提供了对IOC(控制反转)良好支持,IOC是一种编程思想,是一种架构艺术,利用这种思想能够很好地实现模块之间的解耦。IOC也称为DI(Depency Injection),什么叫依赖注入呢?

譬如,Class Programmer

{

Computercomputer = null;

publicvoid code()

{

//Computercomputer = new IBMComputer();

//Computercomputer = beanfacotry.getComputer();

computer.write();

}

publicvoid setComputer(Computer computer)

{

this.computer= computer;

}

}
另外两种方式都由依赖,第一个直接依赖于目标类,第二个把依赖转移到工厂上,第三个完全与目标和工厂解耦了。在spring的配置文件中配置片断以下:

<beanid=”computer” class=”cn.itcast.interview.Computer”>

</bean>

<beanid=”programmer” class=”cn.itcast.interview.Programmer”>

<propertyname=”computer”  ref=”computer”></property>

</bean>

3. Spring提供了对AOP技术的良好封装, AOP称为面向切面编程,就是系统中有不少各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。实现AOP功能采用的是代理技术,客户端程序再也不调用目标,而调用代理类,代理类与目标类对外具备相同的方法声明,有两种方式能够实现相同的方法声明,一是实现相同的接口,二是做为目标的子类在,JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,若是要为某个类生成子类,则能够用CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要建立出代理对象,至少须要目标类和Advice类。spring提供了这种支持,只须要在spring配置文件中配置这两个元素便可实现代理和aop功能

 

Spring流程

请求的分发

请求首先到达DispatcherServlet,应用服务器会根据Web应用中web.xml文件定义的url映射将相应的请求分发到DispatcherServlet中

请求的处理

DispatcherServlet会查找相应的HandlerMapping接口的实现类,调用其中的方法:HandlerExecutionChaingetHandler(HttpServletRequest request) throwsException,该方法会返回一个HandlerExecutionChain。返回的HandlerExecutionChain中包含了零个或者是多个Interceptor和一个处理请求的Handler。DispatcherServlet会调用Interceptor中的preHandle() 方法。而后处理Handler,这个Handler至关于Struts中Action,在SpringMVC中默认的实现是Controller接口,是具体处理请求的代码所驻留的地方。事实上HandlerExecutionChain中的getHandler()返回的是一个Object类型。DispatcherServlet不会直接调用getHandler()返回对象中的方法,DispatcherServlet会查找相应的HandlerAdapter,而后具体经过HandlerAdapter来调用getHandler()返回的handler对象中的方法。就是说咱们能够实现本身的HandlerAdapter而后经过IoC注入到DispatcherServlet中,从而能够实现一套自定义的控制器。随后DispatcherServlet会调用Interceptor中的postHandle()方法。

 

Spring容器基本的接口是什么?

答:beanfactory(容器),applicationContext(应用上下文)

什么是Spring的AOP,它的功能是什么? 

答:AOP是面向方面,至关于拦截器,能够在须要的地方插入逻辑,所谓的面向方面就是把相同的功能抽象出来,

****************************************************************************************************

AOP中的术语

1.通知(Advice):

通知定义了切面是什么以及什么时候使用。描述了切面要完成的工做和什么时候须要执行这个工做。

2.链接点(Joinpoint):

程序可以应用通知的一个“时机”,这些“时机”就是链接点,例如方法被调用时、异常被抛出时等等。

3.切入点(Pointcut)

通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Spring中容许咱们方便的用正则表达式来指定

4.切面(Aspect)

通知和切入点共同组成了切面:时间、地点和要发生的“故事”

5.引入(Introduction)

引入容许咱们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)

6.目标(Target)

即被通知的对象,若是没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP以后它能够只关注本身要作的事(AOP让他作爱作的事)

7.代理(proxy)

应用通知的对象,详细内容参见设计模式里面的代理模式

8.织入(Weaving)

把切面应用到目标对象来建立新的代理对象的过程,织入通常发生在以下几个时机:

(1)编译时:当一个类文件被编译时进行织入,这须要特殊的编译器才能够作的到,例如AspectJ的织入编译器

(2)类加载时:使用特殊的ClassLoader在目标类被加载到程序以前加强类的字节代码

(3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术

****************************************************************************************************

请阐述Spring的IOC,有几种类型。 

答:有setter注入(即类中设置一个全局属性,并对属性有setter方法,以供容器注入),接口注入和构造器注入

Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写?

 

依赖注入是Spring IOC的主要做用,依赖就是指属性,意思就是说将属性利用Spring注入到程序中,而非new。
<bean id="message" class="message
所在类的路径名">
   <property name="message" value="Hello"$amp;>amp;$lt;/property>

</bean>

Spring管理事务有哪几种方式?  · 

答:有两种方式:基于XML配置文件的方式;另外一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

****************************************************************************************************

Spring的做用域有哪些? 

答:singleton(单例) ,prototype(原型),request,session,globalsession

Hibernate

****************************************************************************************************

Hibernate工做原理流程

原理: 1.读取并解析配置文件 2.读取并解析映射信息,建立SessionFactory 3.打开Session 4.建立事务Transation 5.持久化操做 6.提交事务 7.关闭Session 8.关闭SesstionFactory

为何要用Hibernate

为何要用: 1. 对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM(对象关系映射)实现。他很大程度的简化DAO层的编码工做 3. hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。 4. hibernate的性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。

使用Hibernate以前要配置什么

.使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库链接信息和方言等,还要为每一个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中须要登记每一个hbm.xml文件。

 

使用Hibernate的基本流程是:

配置Configuration对象、产生SessionFactory、建立session对象,启动事务,完成CRUD操做,提交事务,关闭session。

相对于SQL,HQL查询语言有什么特色,什么是方言? 

答:sql是关系数据库查询语言,面对的数据库;而hql是Hibernate这样的数据库持久化框架提供的内置查询语言,虽然他们的目的都是为了从数据库查询须要的数据,但sql操做的是数据库表和字段,而做为面向对象的hql操做的则是持久化类及其属性,

****************************************************************************************************

Hibernate架构,对象有三种状态,分别是什么,怎样区分? 

答:Hibernate三种状态的区分,以及save,update,saveOrUpdHibernate的对象有3种状态,

分别为:瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。

1.瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可经过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。 

2.持久对象具备以下特色: 1. 和session实例关联; 2. 在数据库中有与之关联的记录。 3. 比瞬时对象多了一个数据库记录标识值。

3.托管态,也叫游离态等,持久化对象脱离了Session的对象。如Session缓存被清空的对象。特色:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象。

****************************************************************************************************

Hibernate中什么是延迟加载,延迟的做用是什么? 

答:延迟加载机制是为了不一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正须要数据的时候,才真正执行数据加载操做。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

 

hibernate进行多表查询每一个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决;

解决方案一,按照Object[]数据取出数据,而后本身组bean

解决方案二,对每一个表的bean写构造函数,好比表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2

field2),而后在hql里面就能够直接生成这个bean了。

 

第一个:查询出来的list 转换为一个数组  
也就是说 Object[]  objects=(Object[])list    --  你查询出来的list 集合
for(object  item :objects  ){}进行自行封装处理
第二个说白了就是写个构造函数让他本身封装省了本身处理过程了
可是若是是查询出来的多张表数据  仍是得按第一种方式本身处理的。。。

介绍一下Hibernate的二级缓存

(1)缓存就是把之前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构一般是或相似Hashmap,当之后要使用某个对象时,先查询缓存中是否有这个对象,若是有则使用缓存中的对象,若是没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。

(2)Hibernate的Session就是一种缓存,咱们一般将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从本身内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在本身内部。因为Session表明一次会话过程,一个Session与一个数据库链接相关连,因此Session最好不要长时间保持打开,一般仅用于一个事务当中,在事务结束时就应关闭。而且Session是线程不安全的,被多个线程共享时容易出现问题。一般只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,所以,Hibernate的Session这一级缓存的缓存做用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务均可以共享这个缓存。咱们但愿的是一我的使用过,其余人也可使用,session没有这种效果。

(3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一个厂家的缓存产品,接着须要配置该缓存产品本身的配置文件,最后要配置Hibernate中的哪些实体对象要归入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory能够关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其余的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。

简述 Hibernate 和 JDBC 的优缺点? 如何书写一个one to many 配置文件.

 

Hibernate就是封装了JDBC,他能够写一条hql语句,能够再不一样数据库中使用,不用修改hql语句,可是关联查询效率低。

JDBC是基础的连接数据库的框架,效率高,可是mysql、oracle、sql service等不一样的数据库要写不一样的sql语句。

one to many好比Class和Student吧就是一个班级对应多个学生

 

在Class类中追加集合属性 Set<Student> students;

在Class的配置文件中追加(Class.hbm.xml)

<!-- 追加集合属性的配置 -->

                              <!-- 设置集合属性 -->

                              <set name="students" lazy="false" fetch="join"cascade="all" inverse="true">

                                             <!-- 设置关联字段 -->

                                             <key column="classId" />

                                             <!-- 设置关联关系 -->

                                             <one-to-many class="Studnet" />

                              </set>

将Studnet中的classId属性去掉换成 Class class;

在Student的配置文件中(Student.hbm.xml)

<many-to-onename="class" column="classId" lazy="false"fetch="join"

                                             class="Class">

                              </many-to-one>

 

三大框架各起的做用 

struts 在 SSH 框架中起控制的做用 , 其核心是 (控制器)Controller, 即ActionServlet, 而 ActionServlet 的核心就是 Struts-config.xml. 主要控制逻辑关系的处理.    hibernate 是数据持久化层 , 是一种新的对象、关系的映射工具 , 提供了从 Java 类到数据表的映射,也提供了数据查询和恢复等机制 , 大大减小数据访问的复杂度。把对数据库的直接操做 , 转换为对持久对象的操做 .   

spring 是一个轻量级的控制反转 (IoC) 和面向切面 (AOP) 的容器框架 , 面向接口的编程 , 由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转 ” 的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来讲,即由容器动态的将某种依赖关系注入到组件之中  起到的主要做用是解耦

****************************************************************************************************

整合SSH

 

把hibernate的配置写到spring的配置中,用spring管理和调用hibernate的工厂和session等。

struts的话,一般有2中。一种是用spring中的一个工厂类代替struts的工厂类去生成action,而且用spring管理。 另外一种是,struts 用本身的工厂生成action,可是由spring管理。这样耦合低一些。

大概就是这样,hibernate负责它最擅长的数据库管理。 struts页面的请求处理调用相应的底层数据库等。spring负责管理他们两个。

 

****************************************************************************************************

整合SSH的三种方法

 

方法一:直接得到ApplicationContext对象

 

这种方法经过spring获取与Hibernate相关联的对象。

 

关键是在Action类中得到ApplicationContext对象,而后经过getBean方法得到JavaBean对象。

 

(1)在hibernate.cfg.xml文件中配置session-factory

 

   <session-factory>

 

      <propertyname="connection.url">

 

          jdbc:mysql://localhost/test?characterEncoding=UTF8

 

      </property>

 

      <propertyname="dialect">

 

          org.hibernate.dialect.MySQLDialect

 

      </property>

 

      <propertyname="connection.username">root</property>

 

      <propertyname="connection.password">123</property>

 

      <propertyname="show_sql">true</property>

 

      <propertyname="hibernate.hbm2ddl.auto">update</property>

 

      <propertyname="connection.driver_class">

 

          com.mysql.jdbc.Driver

 

      </property>     

 

<!—数据库的实体类映射文件-->

 

       <mappingresource="User.hbm.xml" />

 

   </session-factory>

 

 

 

(2)在applicationContext.xml文件中对hibernate相关联的对象使用依赖注入,使用Spring的HibernateTemplate类来对Hibernate的Session进行操做

 

   <beanid="sessionFactory"      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

 

      <propertyname="configLocation"value="classpath:hibernate.cfg.xml">

 

      </property>

 

   </bean>

 

 

 

   <bean id="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate">

 

      <propertyname="sessionFactory"ref="sessionFactory" />

 

   </bean>

 

 

 

   <!-- 事务拦截器bean须要依赖注入一个事务管理器 -->

 

   <bean id="transactionManager"

 

      class="org.springframework.orm.hibernate3.HibernateTransactionManager">

 

      <propertyname="sessionFactory">

 

          <refbean="sessionFactory" />

 

      </property>

 

   </bean>

 

 

 

   <!-- 设置事务传播特性,对应于AOP中的 <tx:advice />  -->

 

   <bean id="transactionInterceptor"

 

      class="org.springframework.transaction.interceptor.TransactionInterceptor">

 

      <propertyname="transactionManager">

 

          <refbean="transactionManager" />

 

      </property>

 

      <propertyname="transactionAttributes">

 

          <props>

 

             <propkey="get*">PROPAGATION_REQUIRED,readOnly

 

             </prop>

 

             <propkey="*">PROPAGATION_REQUIRED</prop>

 

          </props>

 

      </property>

 

   </bean>  

 

    <!-- 定义BeanNameAutoProxyCreator,配置哪些类和哪些方法使用事务对应于AOP中的 <aop:pointcut/> -->  

 

   <bean

 

      class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

 

      <!-- 指定对知足哪些bean name的bean自动生成业务代理 -->

 

      <propertyname="beanNames">

 

          <!-- 下面是全部须要自动建立事务代理的bean-->  

 

          <list>

 

              <value>userDAO</value>            

 

          </list>

 

          <!-- 此处可增长其余须要自动建立事务代理的bean-->

 

      </property>

 

      <propertyname="interceptorNames">

 

          <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->  

 

          <list>

 

             <value>transactionInterceptor</value>

 

              <!-- 此处可增长其余新的Interceptor-->

 

          </list>

 

      </property>

 

   </bean>  

 

 

 

      <!--配置数据访问层对象-->

 

   <beanid="userDAO"class="com.dao.UserDAOImpl">

 

      <constructor-arg>

 

          <refbean="hibernateTemplate" />

 

      </constructor-arg>

 

   </bean>

 

 

 

      <!--配置业务逻辑层对象-->

 

   <bean id="userService"class="com.service.UserServiceImpl">

 

      <constructor-arg>

 

          <refbean="userDAO" />

 

      </constructor-arg>

 

   </bean>

 

 

 

(3)配置struts.xml文件

 

      <actionname="loginAction"class="com.test.LoginAction">

 

          <resultname="result">/WEB-INF/result.jsp

 

          </result>       

 

      </action>

 

(4)在Action中获取userService并使用

 

          ApplicationContextapplicationContext=             WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());

 

          UserServiceuserService = (UserServiceImpl)applicationContext.getBean("userService");

 

          userService.addUser(user);

 

 

 

第一种方法的缺点:将Action类鱼Spring的装配JavaBean绑定的过紧,增长了其耦合度,不适合装配文件有变化的状况。

 

 

 

 

 

方法二:由Spring建立Action类的对象

 

在方法一的基础之上须要作以下几步修改

 

(1)在Action方法中增长setUserService的方法,把UserService交给spring处理

 

private UserService userService;

 

public void setUserService(UserServiceuserService) {

 

   this.userService = userService;

 

}

 

(2)在application.xml文件中对action进行配置

 

<bean id=”loginAction”class=”com.test.LoginAction”scope=”prototype”>

 

   <property name=” userService”>

 

       <ref bean=” userService”>

 

   </property>

 

</bean>

 

(3)在struts.xml文件中配置action

 

<action name=”LoginAction”class=”loginAction”/>

 

<!—注意这里class指向的是上面配置的bean对象-->

 

 

 

第二种方法的缺点:虽然使用了Spring的IOC特性,对Action和ApplicationContext对象进行了解耦,但配置一个Action须要同时维护两份文件:struts.xml和application.xml,比较难维护。

 

 

 

方法三:直接使用Spring的自动装配JavaBean的特性进行整合

 

       在方法一的配置基础上进行以下修改

 

(1)编写UserAction类,在UserAction中添加setUserService方法,让spring自动装配

 

private UserService userService;

 

public void setUserService(UserServiceuserService) {

 

   this.userService = userService;

 

}

 

(2)直接在Struts中配置LoginAction

 

<action name=”LoginAction”class=”com.test.LoginAction”/>

 

因为已经在application.xml文件中装配了userService属性,这样spring就能够自动装配LoginAction中的UserService了。

 

*****************************************************************************************************************************

其余

j2ee经常使用的设计模式?说明工厂模式。

总共23种,分为三大类:建立型,结构型,行为型

我只记得其中经常使用的六、7种,分别是:

建立型(工厂、工厂方法、抽象工厂、单例)

结构型(包装、适配器,组合,代理)

行为(观察者,模版,策略)

而后再针对你熟悉的模式谈谈你的理解便可。

工厂模式:

工厂模式是一种常常被使用到的模式,根据工厂模式实现的类能够根据提供的数据生成一组类中某一个类的实例,一般这一组类有一个公共的抽象父类而且实现了相同的方法,可是这些方法针对不一样的数据进行了不一样的操做。首先须要定义一个基类,该类的子类经过不一样的方法实现了基类中的方法。而后须要定义一个工厂类,工厂类能够根据条件生成不一样的子类实例。当获得子类的实例后,开发人员能够调用基类中的方法而没必要考虑到底返回的是哪个子类的实例。

单例模式

在它的核心结构中只包含一个被称为单例类的特殊类。经过单例模式能够保证系统中一个类只有一个实例并且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。若是但愿在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

1. Hibernate3 提供了属性的延迟加载功能?

  当Hibernate在查询数据的时候,数据并无存在与内存中,当程序真正对数据的操做时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提升了服务器的性能。

  2.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

  类与类之间的关系主要体如今表与表之间的关系进行操做,它们都市对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many

  3.JSF是什么?

  JavaServer Face是基于组件的web开发框架,跟sturts差很少的框架

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

  索引是为了提升数据的检索速度,索引是创建在数据表上,根据一个或多个字段创建的约束是为了保持数据的完整性,约束有非空约束,主键约束,外键约束等等。

  5.Hibernate工做原理及为何要用?

  原理: 1.读取并解析配置文件 2.读取并解析映射信息,建立SessionFactory 3.打开Session 4.建立事务Transation 5.持久化操做 6.提交事务 7.关闭Session8.关闭SesstionFactory

  为何要用: 1. 对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。 2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工做 3. hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。 4. hibernate的性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。

  6.Hibernate是如何延迟加载?

  1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)

  7.Struts1流程:

  一、客户端浏览器发出HTTP请求。二、根据web.xml配置,该请求被ActionServlet接收。三、根据struts-config.xml配置, ActionServlet先将请求中的参数填充到ActionForm中,而后ActionServlet再将请求发送到Action 进行处理。四、是否验证,须要验证则调用ActionForm的validate方法,验证失败则跳转到input,成功则继续。五、Action从 ActionForm得到数据,调用javabean 中的业务方法处理数据。六、Action返回ActionForward对象,跳转到相应JSP页面或Action。七、返回HTTP响应到客户端浏览器。

  MVC设计模式:modal:“模型” 也称业务逻辑,是正真完成任务的代码,至关与JavaBeanview:视图,其实就是显示界面,至关于JSPcontroller:控制器,他控制模型和视图的交互过程,至关于servletstruts1是基于MVC设计模式hibernate是基于ORM对象关系映射

  8.struts是什么?

  struts1是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式struts2是基于webwork技术的框架,是sun和webwork公司联手开发的一个功能很是齐全的框架,struts2和struts1没有任何关系,是一个全新的框架

  9.spring是什么?

  spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程)

  10.hibernate是什么?

  hibernate是基于ORM对象关系映射(完成对象数据到关系数据映射的机制)实现的,作数据持久化的工具

  11.spring是什么

  这个问题,每每能够经过咱们为何要使用spring这个问题来切入:AOP 让开发人员能够建立非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就能够分解成方面并应用到域对象上,同时不会增长域对象的对象模型的复杂性。 IOC 容许建立一个能够构造对象的应用环境,而后向这些对象传递它们的协做对象。正如单词倒置 所代表的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每个对象都是用其协做对象构造的。所以是由容器管理协做对象(collaborator)。 Spring即便一个AOP框架,也是一IOC容器。Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协做对象)。而后能够很容易地在须要时替换具备相似接口的协做对象。

  12.用本身的话简要阐述struts2的执行流程。

  Struts 2框架自己大体能够分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器 FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是须要用户来本身实现的。用户在开发Action和业务逻辑组件的同时,还须要编写相关的配置文件,供核心控制器FilterDispatcher来使用。

  Struts 2的工做流程相对于Struts 1要简单,与WebWork框架基本相同,因此说Struts 2是WebWork的升级版本。基本简要流程以下:一、客户端浏览器发出HTTP请求。二、根据web.xml配置,该请求被 FilterDispatcher接收。三、根据struts.xml配置,找到须要调用的Action类和方法, 并经过IoC方式,将值注入给Aciton。四、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。五、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。六、返回HTTP响应到客户端浏览器。

 

 

1、什么是Spring框架?Spring框架有哪些主要模块?

Spring框架是一个为Java应用程序的开发提供了综合、普遍的基础性支持的Java平台。

Spring帮助开发者解决了开发中基础性的问题,使得开发人员能够专一于应用程序的开发。

Spring框架自己亦是按照设计模式精心打造,这使得咱们能够在开发环境中安心的集成Spring框架,没必要担忧Spring是如何在后台进行工做的。

Spring框架至今已集成了20多个模块。这些模块主要被分以下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

2、使用Spring框架能带来哪些好处?

下面列举了一些使用Spring框架带来的主要好处:

·        DependencyInjection(DI) 方法使得构造器和JavaBeanproperties文件中的依赖关系一目了然。

·        与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的状况下进行应用程序的开发和发布就变得十分有利。

·        Spring并无闭门造车,Spring利用了已有的技术好比ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其余视图技术。

·        Spring框架是按照模块的形式来组织的。由包和类的编号就能够看出其所属的模块,开发者仅仅须要选用他们须要的模块便可。

·        要测试一项用Spring开发的应用程序十分简单,由于测试相关的环境代码都已经囊括在框架中了。更加简单的是,利用JavaBean形式的POJO类,能够很方便的利用依赖注入来写入测试数据。

·        Spring的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架好比Struts、过分设计的、不流行web框架的之外的有力选项。

·        Spring提供了一个便捷的事务管理接口,适用于小型的本地事物处理(好比在单DB的环境下)和复杂的共同事物处理(好比利用JTA的复杂DB环境)。

3、什么是控制反转(IOC)?什么是依赖注入?

控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时一般是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的状况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还能够将对象之间的关联关系的定义抽象化。而绑定的过程是经过“依赖注入”实现的。

控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在咱们的实际工做中起到了有效的做用。

依赖注入是在编译阶段还没有知所需的功能是来自哪一个的类的状况下,将其余对象所依赖的功能对象实例化的模式。这就须要一种机制用来激活相应的组件以提供特定的功能,因此依赖注入是控制反转的基础。不然若是在组件不受框架控制的状况下,框架又怎么知道要建立哪一个组件?

在Java中依然注入有如下三种实现方式:

1.    构造器注入

2.    Setter方法注入

3.    接口注入

4、请解释下Spring框架中的IoC?

Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。

BeanFactory接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其余功能,好比与Spring的AOP更容易集成,也提供了处理message resource的机制(用于国际化)、事件传播以及应用层的特别配置,好比针对Web应用的WebApplicationContext。

org.springframework.beans.factory.BeanFactory 是SpringIoC容器的具体实现,用来包装和管理前面提到的各类bean。BeanFactory接口是Spring IoC 容器的核心接口。

IOC:把对象的建立、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转。

 

5、BeanFactory和ApplicationContext有什么区别?

BeanFactory 能够理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。

BeanFactory还能在实例化对象的时生成协做类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initializationmethods)和销毁方法(destruction methods)。

从表面上看,application context如同bean factory同样具备bean定义、bean关联关系的设置,根据请求分发bean的功能。但applicationcontext在此基础上还提供了其余的功能。

1.    提供了支持国际化的文本消息

2.    统一的资源文件读取方式

3.    已在监听器中注册的bean的事件

如下是三种较常见的 ApplicationContext 实现方式:

一、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。

[html] view plain copy

  1. ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);    

二、FileSystemXmlApplicationContext:由文件系统中的XML配置文件读取上下文。

[html] view plain copy

  1. ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);   

 

三、XmlWebApplicationContext:由Web应用的XML文件读取上下文。

 

6、Spring有几种配置方式?

将Spring配置到应用开发中有如下三种方式:

1.    基于XML的配置

2.    基于注解的配置

3.    基于Java的配置

7、如何用基于XML配置的方式配置Spring?

在Spring框架中,依赖和服务须要在专门的配置文件来实现,我经常使用的XML格式的配置文件。这些配置文件的格式一般用<beans>开头,而后一系列的bean定义和专门的应用配置选项组成。

SpringXML配置的主要目的时候是使全部的Spring组件均可以用xml文件的形式来进行配置。这意味着不会出现其余的Spring配置类型(好比声明的方式或基于Java Class的配置方式)

Spring的XML配置方式是使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有如下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。

如:

[html] view plain copy

  1. <beans>    
  2.     <!-- JSON Support -->    
  3.     <bean name="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>    
  4.     <bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>    
  5.     <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>    
  6. </beans>   

下面这个web.xml仅仅配置了DispatcherServlet,这件最简单的配置便能知足应用程序配置运行时组件的需求。

[html] view plain copy

  1. <web-app>    
  2.     <display-name>Archetype Created Web Application</display-name>    
  3.     <servlet>    
  4.         <servlet-name>spring</servlet-name>    
  5.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
  6.         <load-on-startup>1</load-on-startup>    
  7.     </servlet>    
  8.     <servlet-mapping>    
  9.         <servlet-name>spring</servlet-name>    
  10.         <url-pattern>/</url-pattern>    
  11.     </servlet-mapping>    
  12. </web-app>   

8、如何用基于Java配置的方式配置Spring?

Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的做用与<bean/> 元素相似。被@Configuration所注解的类则表示这个类的主要目的是做为bean定义的资源。被@Configuration声明的类能够经过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。

最简单的@Configuration 声明类请参考下面的代码:

[java] view plain copy

  1. @Configuration    
  2. public class AppConfig{    
  3.     @Bean    
  4.     public MyService myService() {    
  5.         return new MyServiceImpl();    
  6.     }    
  7. }   

对于上面的@Beans配置文件相同的XML配置文件以下:

[html] view plain copy

  1. <beans>    
  2.     <bean id="myService" class="com.somnus.services.MyServiceImpl"/>    
  3. </beans>   

上述配置方式的实例化方式以下:利用AnnotationConfigApplicationContext 类进行实例化

[java] view plain copy

  1. public static void main(String[] args) {    
  2.     ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);    
  3.     MyService myService = ctx.getBean(MyService.class);    
  4.     myService.doStuff();    
  5. }  

要使用组件组建扫描,仅需用@Configuration进行注解便可:

[java] view plain copy

  1. @Configuration    
  2. @ComponentScan(basePackages = "com.somnus")    
  3. public class AppConfig  {    
  4.     ...    
  5. }   

在上面的例子中,com.acme包首先会被扫到,而后再容器内查找被@Component 声明的类,找到后将这些类按照Sring bean定义进行注册。

若是你要在你的web应用开发中选用上述的配置的方式的话,须要用AnnotationConfigWebApplicationContext 类来读取配置文件,能够用来配置Spring的Servlet监听器ContextLoaderListener或者Spring MVC的DispatcherServlet。

[html] view plain copy

  1. <web-app>    
  2.     <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext    
  3.         instead of the default XmlWebApplicationContext -->    
  4.     <context-param>    
  5.         <param-name>contextClass</param-name>    
  6.         <param-value>    
  7.             org.springframework.web.context.support.AnnotationConfigWebApplicationContext    
  8.         </param-value>    
  9.     </context-param>    
  10.      
  11.     <!-- Configuration locations must consist of one or more comma- or space-delimited    
  12.         fully-qualified @Configuration classes. Fully-qualified packages may also be    
  13.         specified for component-scanning -->    
  14.     <context-param>    
  15.         <param-name>contextConfigLocation</param-name>    
  16.         <param-value>com.howtodoinjava.AppConfig</param-value>    
  17.     </context-param>    
  18.      
  19.     <!-- Bootstrap the root application context as usual using ContextLoaderListener -->    
  20.     <listener>    
  21.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  22.     </listener>    
  23.      
  24.     <!-- Declare a Spring MVC DispatcherServlet as usual -->    
  25.     <servlet>    
  26.         <servlet-name>dispatcher</servlet-name>    
  27.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
  28.         <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext    
  29.             instead of the default XmlWebApplicationContext -->    
  30.         <init-param>    
  31.             <param-name>contextClass</param-name>    
  32.             <param-value>    
  33.                 org.springframework.web.context.support.AnnotationConfigWebApplicationContext    
  34.             </param-value>    
  35.         </init-param>    
  36.         <!-- Again, config locations must consist of one or more comma- or space-delimited    
  37.             and fully-qualified @Configuration classes -->    
  38.         <init-param>    
  39.             <param-name>contextConfigLocation</param-name>    
  40.             <param-value>com.howtodoinjava.web.MvcConfig</param-value>    
  41.         </init-param>    
  42.     </servlet>    
  43.      
  44.     <!-- map all requests for /app/* to the dispatcher servlet -->    
  45.     <servlet-mapping>    
  46.         <servlet-name>dispatcher</servlet-name>    
  47.         <url-pattern>/app/*</url-pattern>    
  48.     </servlet-mapping>    
  49. </web-app    

 

9、怎样用注解的方式配置Spring

Spring在2.5版本之后开始支持用注解的方式来配置依赖注入。能够用注解的方式来替代XML方式的bean描述,能够将bean描述转移到组件类的内部,只须要在相关类上、方法上或者字段声明上使用注解便可。注解注入将会被容器在XML注入以前被处理,因此后者会覆盖掉前者对于同一个属性的处理结果。

注解装配在Spring中是默认关闭的。因此须要在Spring文件中配置一下才能使用基于注解的装配模式。若是你想要在你的应用程序中使用关于注解的方法的话,请参考以下的配置。

[html] view plain copy

  1. <beans>    
  2.    <context:annotation-config/>    
  3.    <!-- bean definitions go here -->    
  4. </beans>    

在 <context:annotation-config/>标签配置完成之后,就能够用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。

下面是几种比较重要的注解类型:

1.    @Required:该注解应用于设值方法。

2.    @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

3.    @Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。

4.    JSR-250 Annotations:Spring支持基于JSR-250 注解的如下注解,@Resource、@PostConstruct 和 @PreDestroy。

10、请解释Spring Bean的生命周期?

Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,须要执行一系列的初始化操做以达到可用的状态。一样的,当一个bean不在被调用时须要进行相关的析构操做,并从bean容器中移除。

Spring bean factory 负责管理在spring容器中被建立的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。

1.    初始化以后调用的回调方法。

2.    销毁以前调用的回调方法。

Spring框架提供了如下四种方式来管理bean的生命周期事件:

·        InitializingBean和DisposableBean回调接口

·        针对特殊行为的其余Aware接口

·        Bean配置文件中的Custom init()方法和destroy()方法

·        @PostConstruct和@PreDestroy注解方式

使用customInit()和 customDestroy()方法管理bean生命周期的代码样例以下:

[html] view plain copy

  1. <beans>    
  2.     <bean id="demoBean" class="com.somnus.task.DemoBean" init-method="customInit" destroy-method="customDestroy"></bean>    
  3. </beans>    

11、Spring Bean的做用域之间有什么区别?

Spring容器中的bean能够分为5个范围。全部范围的名称都是自说明的,可是为了不混淆,仍是让咱们来解释一下:

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

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

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

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

5.    global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工做时,它包含不少portlet。若是你想要声明让全部的portlet共用全局的存储变量的话,那么这全局变量须要存储在global-session中。

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

12、什么是Spring inner beans

在Spring框架中,不管什么时候bean被使用时,当仅被调用了一个属性。一个明智的作法是将这个bean声明为内部bean。内部bean能够用setter注入“属性”和构造方法注入“构造参数”的方式来实现。

好比,在咱们的应用程序中,一个Customer类引用了一个Person类,咱们的要作的是建立一个Person的实例,而后在Customer内部使用。

[java] view plain copy

  1. public class Customer{    
  2.     private Person person;    
  3.     //Setters and Getters    
  4. }   

 

[java] view plain copy

  1. public class Person{    
  2.     private String name;    
  3.     private String address;    
  4.     private int age;    
  5.     //Setters and Getters    
  6. }  

内部bean的声明方式以下:

[java] view plain copy

  1. <bean id="CustomerBean" class="com.somnus.common.Customer">    
  2.     <property name="person">    
  3.         <!-- This is inner bean -->    
  4.         <bean class="com.howtodoinjava.common.Person">    
  5.             <property name="name" value="lokesh" />    
  6.             <property name="address" value="India" />    
  7.             <property name="age" value="34" />    
  8.         </bean>    
  9.     </property>    
  10. </bean>   

 

13、Spring框架中的单例Beans是线程安全的么?

Spring框架并无对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题须要开发者自行去搞定。但实际上,大部分的Spring bean并无可变的状态(好比Serview类和DAO类),因此在某种程度上说Spring的单例bean是线程安全的。若是你的bean有多种状态的话(好比 View Model 对象),就须要自行保证线程安全。
最浅显的解决办法就是将多态bean的做用域由“singleton”变动为“prototype”。

 

14、请举例说明如何在Spring中注入一个Java Collection?

Spring提供了如下四种集合类的配置元素:

·        <list> :  该标签用来装配可重复的list值。

·        <set> :   该标签用来装配没有重复的set值。

·        <map>:  该标签可用来注入键和值能够为任何类型的键值对。

·        <props> : 该标签支持注入键和值都是字符串类型的键值对。

下面看一下具体的例子:

[html] view plain copy

  1. <beans>    
  2.    <!-- Definition for javaCollection -->    
  3.    <bean id="javaCollection" class="com.howtodoinjava.JavaCollection">    
  4.       <!-- java.util.List -->    
  5.       <property name="customList">    
  6.         <list>    
  7.            <value>INDIA</value>    
  8.            <value>Pakistan</value>    
  9.            <value>USA</value>    
  10.            <value>UK</value>    
  11.         </list>    
  12.       </property>    
  13.      
  14.      <!-- java.util.Set -->    
  15.      <property name="customSet">    
  16.         <set>    
  17.            <value>INDIA</value>    
  18.            <value>Pakistan</value>    
  19.            <value>USA</value>    
  20.            <value>UK</value>    
  21.         </set>    
  22.       </property>    
  23.      
  24.      <!-- java.util.Map -->    
  25.      <property name="customMap">    
  26.         <map>    
  27.            <entry key="1" value="INDIA"/>    
  28.            <entry key="2" value="Pakistan"/>    
  29.            <entry key="3" value="USA"/>    
  30.            <entry key="4" value="UK"/>    
  31.         </map>    
  32.       </property>    
  33.      
  34.     <!-- java.util.Properties -->    
  35.     <property name="customProperies">    
  36.         <props>    
  37.             <prop key="admin">admin@nospam.com</prop>    
  38.             <prop key="support">support@nospam.com</prop>    
  39.         </props>    
  40.     </property>    
  41.      
  42.    </bean>    
  43. </beans>    

 

15、如何向Spring Bean中注入一个Java.util.Properties?

第一种方法是使用以下面代码所示的<props> 标签:

[html] view plain copy

  1. <bean id="adminUser" class="com.somnus.common.Customer">    
  2.      
  3.     <!-- java.util.Properties -->    
  4.     <property name="emails">    
  5.         <props>    
  6.             <prop key="admin">admin@nospam.com</prop>    
  7.             <prop key="support">support@nospam.com</prop>    
  8.         </props>    
  9.     </property>    
  10.      
  11. </bean>   

也可用”util:”命名空间来从properties文件中建立出一个propertiesbean,而后利用setter方法注入bean的引用。

1六、请解释SpringBean的自动装配?

在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring容器还能够自动装配合做关系bean之间的关联关系。这意味着Spring能够经过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配能够设置在每一个bean上,也能够设定在特定的bean上。

下面的XML配置文件代表了如何根据名称将一个bean设置为自动装配:

[html] view plain copy

  1. <bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" />   

除了bean配置文件中提供的自动装配模式,还可使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解以前须要在按照以下的配置方式在Spring配置文件进行配置才可使用。

[html] view plain copy

  1. <context:annotation-config />  

也能够经过在配置文件中配置AutowiredAnnotationBeanPostProcessor 达到相同的效果。

[html] view plain copy

  1. <bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>    

配置好之后就可使用@Autowired来标注了。

[java] view plain copy

  1. @Autowired    
  2. public EmployeeDAOImpl ( EmployeeManager manager ) {    
  3.     this.manager = manager;    
  4. }  

 

1七、请解释自动装配模式的区别?

在Spring框架中共有5种自动装配,让咱们逐一分析。

1.    no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者须要自行在bean定义中用标签明确的设置依赖关系。

2.    byName:该选项能够根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。若是找到的话,就装配这个属性,若是没找到的话就报错。

3.    byType:该选项能够根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。若是找到的话,就装配这个属性,若是没找到的话就报错。

4.    constructor:造器的自动装配和byType模式相似,可是仅仅适用于与有构造器相同参数的bean,若是在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

5.    autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,若是找到的话就是用构造器自动装配,若是在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。

18、如何开启基于注解的自动装配?

要使用 @Autowired,须要注册 AutowiredAnnotationBeanPostProcessor,能够有如下两种方式来实现:

一、引入配置文件中的<bean>下引入 <context:annotation-config>

[html] view plain copy

  1. <beans>    
  2.     <context:annotation-config />    
  3. </beans>   

二、在bean配置文件中直接引入AutowiredAnnotationBeanPostProcessor

[html] view plain copy

  1. <beans>    
  2.     <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>    
  3. </beans>    

 

19、请举例解释@Required注解?

在产品级别的应用中,IoC容器可能声明了数十万了bean,bean与bean之间有着复杂的依赖关系。设值注解方法的短板之一就是验证全部的属性是否被注解是一项十分困难的操做。能够经过在<bean>中设置“dependency-check”来解决这个问题。

在应用程序的生命周期中,你可能不大愿意花时间在验证全部bean的属性是否按照上下文文件正确配置。或者你宁肯验证某个bean的特定属性是否被正确的设置。即便是用“dependency-check”属性也不能很好的解决这个问题,在这种状况下,你须要使用@Required 注解。

须要用以下的方式使用来标明bean的设值方法。

[java] view plain copy

  1. public class EmployeeFactoryBean extends AbstractFactoryBean<Object>{    
  2.     private String designation;    
  3.     public String getDesignation() {    
  4.         return designation;    
  5.     }    
  6.     @Required    
  7.     public void setDesignation(String designation) {    
  8.         this.designation = designation;    
  9.     }    
  10.     //more code here    
  11. }    

RequiredAnnotationBeanPostProcessor是Spring中的后置处理用来验证被@Required 注解的bean属性是否被正确的设置了。在使用RequiredAnnotationBeanPostProcesso来验证bean属性以前,首先要在IoC容器中对其进行注册:

[html] view plain copy

  1. <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />    

可是若是没有属性被用 @Required 注解过的话,后置处理器会抛出一个BeanInitializationException 异常。

20、请举例解释@Autowired注解?

@Autowired注解对自动装配什么时候何处被实现提供了更多细粒度的控制。@Autowired注解能够像@Required注解、构造器同样被用于在bean的设值方法上自动装配bean的属性,一个参数或者带有任意名称或带有多个参数的方法。

好比,能够在设值方法上使用@Autowired注解来替代配置文件中的 <property>元素。当Spring容器在setter方法上找到@Autowired注解时,会尝试用byType 自动装配。

固然咱们也能够在构造方法上使用@Autowired 注解。带有@Autowired 注解的构造方法意味着在建立一个bean时将会被自动装配,即使在配置文件中使用<constructor-arg> 元素。

[java] view plain copy

  1. public class TextEditor {    
  2.    private SpellChecker spellChecker;    
  3.    @Autowired    
  4.    public TextEditor(SpellChecker spellChecker){    
  5.       System.out.println("Inside TextEditor constructor." );    
  6.       this.spellChecker = spellChecker;    
  7.    }    
  8.    public void spellCheck(){    
  9.       spellChecker.checkSpelling();    
  10.    }    
  11. }    

下面是没有构造参数的配置方式:

[html] view plain copy

  1. <beans>    
  2.      
  3.    <context:annotation-config/>    
  4.      
  5.    <!-- Definition for textEditor bean without constructor-arg  -->    
  6.    <bean id="textEditor" class="com.howtodoinjava.TextEditor"/>    
  7.      
  8.    <!-- Definition for spellChecker bean -->    
  9.    <bean id="spellChecker" class="com.howtodoinjava.SpellChecker"/>    
  10.      
  11. </beans>    

 

21、请举例说明@Qualifier注解?

@Qualifier注解意味着能够在被标注bean的字段上能够自动装配。Qualifier注解能够用来取消Spring不能取消的bean应用。

下面的示例将会在Customer的person属性中自动装配person的值。

[java] view plain copy

  1. public class Customer{    
  2.     @Autowired    
  3.     private Person person;    
  4. }   

下面咱们要在配置文件中来配置Person类。

[html] view plain copy

  1. <bean id="customer" class="com.somnus.common.Customer" />    
  2.      
  3. <bean id="personA" class="com.somnus.common.Person" >    
  4.     <property name="name" value="lokesh" />    
  5. </bean>    
  6.      
  7. <bean id="personB" class="com.somnus.common.Person" >    
  8.     <property name="name" value="alex" />    
  9. </bean>    

Spring会知道要自动装配哪一个person bean么?不会的,可是运行上面的示例时,会抛出下面的异常:

[html] view plain copy

  1. Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:    
  2.     No unique bean of type [com.howtodoinjava.common.Person] is defined:    
  3.         expected single matching bean but found 2: [personA, personB]    

要解决上面的问题,须要使用 @Quanlifier注解来告诉Spring容器要装配哪一个bean:

[java] view plain copy

  1. public class Customer{    
  2.     @Autowired    
  3.     @Qualifier("personA")    
  4.     private Person person;    
  5. }  

 

22、构造方法注入和设值注入有什么区别?

请注意如下明显的区别:

1.    在设值注入方法支持大部分的依赖注入,若是咱们仅须要注入int、string和long型的变量,咱们不要用设值的方法注入。对于基本类型,若是咱们没有注入的话,能够为基本类型设置默认值。在构造方法注入不支持大部分的依赖注入,由于在调用构造方法中必须传入正确的构造参数,不然的话为报错。

2.    设值注入不会重写构造方法的值。若是咱们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。很明显,由于构造方法尽在对象被建立时调用。

3.    在使用设值注入时有可能还不能保证某种依赖是否已经被注入,也就是说这时对象的依赖关系有多是不完整的。而在另外一种状况下,构造器注入则不容许生成依赖关系不完整的对象。

4.    在设值注入时若是对象A和对象B互相依赖,在建立对象A时Spring会抛出sObjectCurrentlyInCreationException异常,由于在B对象被建立以前A对象是不能被建立的,反之亦然。因此Spring用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被建立以前被调用的。

23、Spring框架中有哪些不一样类型的事件?

Spring的ApplicationContext 提供了支持事件和代码中监听器的功能。

咱们能够建立bean用来监听在ApplicationContext 中发布的事件。ApplicationEvent类和在ApplicationContext接口中处理的事件,若是一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布之后,bean会自动被通知。

[java] view plain copy

  1. public class AllApplicationEventListener implements ApplicationListener < ApplicationEvent >{    
  2.     @Override    
  3.     public void onApplicationEvent(ApplicationEvent applicationEvent)    
  4.     {    
  5.         //process event    
  6.     }    
  7. }    

 

Spring 提供了如下5中标准的事件:

1.    上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者更新时发布。也能够在调用ConfigurableApplicationContext接口中的refresh()方法时被触发。

2.    上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/从新开始容器时触发该事件。

3.    上下文中止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法中止容器时触发该事件。

4.    上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的全部单例Bean都被销毁。

5.    请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。

除了上面介绍的事件之外,还能够经过扩展ApplicationEvent 类来开发自定义的事件。

[java] view plain copy

  1. public class CustomApplicationEvent extends ApplicationEvent{    
  2.     public CustomApplicationEvent ( Object source, final String msg ){    
  3.         super(source);    
  4.         System.out.println("Created a Custom event");    
  5.     }    
  6. }    

为了监听这个事件,还须要建立一个监听器:

[java] view plain copy

  1. public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{    
  2.     @Override    
  3.     public void onApplicationEvent(CustomApplicationEvent applicationEvent) {    
  4.         //handle event    
  5.     }    
  6. }    


以后经过applicationContext接口的publishEvent()方法来发布自定义事件。

[java] view plain copy

  1. CustomApplicationEvent customEvent = new CustomApplicationEvent(applicationContext, "Test message");    
  2. applicationContext.publishEvent(customEvent);    

 

24、FileSystemResource和ClassPathResource有何区别?

FileSystemResource 中须要给出spring-config.xml文件在你项目中的相对路径或者绝对路径。在ClassPathResource中spring会在ClassPath中自动搜寻配置文件,因此要把ClassPathResource 文件放在ClassPath下。

若是将spring-config.xml保存在了src文件夹下的话,只需给出配置文件的名称便可,由于src文件夹是默认。

简而言之,ClassPathResource在环境变量中读取配置文件,FileSystemResource在配置文件中读取配置文件。

25、Spring 框架中都用到了哪些设计模式?

Spring框架中使用到了大量的设计模式,下面列举了比较有表明性的:

·        代理模式—在AOP和remoting中被用的比较多。

·        单例模式—在spring配置文件中定义的bean默认为单例模式。

·        模板方法—用来解决代码重复的问题。好比. RestTemplateJmsTemplateJpaTemplate

·        前端控制器—Spring提供了DispatcherServlet来对请求进行分发。

·        视图帮助(ViewHelper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。

·        依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。

·        工厂模式—BeanFactory用来建立对象的实例。

转至:http://blog.csdn.net/lovesomnus/article/details/46470255

 

 

Java工程师三大框架面试题

1.Hibernate工做原理及为何要用?

原理: 1.读取并解析配置文件 2.读取并解析映射信息,建立SessionFactory 3.打开Session 4.建立事务Transation 5.持久化操做 6.提交事务 7.关闭Session 8.关闭SesstionFactory 

为何要用: 1. 对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工做 3. hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。 4. hibernate的性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。 

 

2.Hibernate是如何延迟加载? 

1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 

2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并无存在与内存中,当程序真正对数据的操做时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提升了服务器的性能。 

 

3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 

类与类之间的关系主要体如今表与表之间的关系进行操做,它们都市对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many 

 

4.Struts1流程:

一、客户端浏览器发出HTTP请求。二、根据web.xml配置,该请求被ActionServlet接收。三、根据struts- config.xml配置, ActionServlet先将请求中的参数填充到ActionForm中,而后ActionServlet再将请求发送到Action 进行处理。四、是否验证,须要验证则调用ActionForm的validate方法,验证失败则跳转到input,成功则继续。五、Action从 ActionForm得到数据,调用javabean 中的业务方法处理数据。六、Action返回ActionForward对象,跳转到相应JSP页面或Action。七、返回HTTP响应到客户端浏览 器。

 

MVC设计模式:modal:“模型” 也称业务逻辑,是正真完成任务的代码,至关与JavaBeanview:视图,其实就是显示界面,至关于JSPcontroller:控制器,他控制模型 和视图的交互过程,至关于servletstruts1是基于MVC设计模式hibernate是基于ORM对象关系映射 

 

5.struts是什么?

struts1是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式struts2是基于webwork技术的框架,是sun和webwork公司联手开发的一个功能很是齐全的框架,struts2和struts1没有任何关系,是一个全新的框架 

 

6.spring是什么?

spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程) 

 

7.hibernate是什么?

hibernate是基于ORM对象关系映射(完成对象数据到关系数据映射的机制)实现的,作数据持久化的工具 

 

8.JSF是什么?

JavaServer Face是基于组件的web开发框架,跟sturts差很少的框架 

 

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

索引是为了提升数据的检索速度,索引是创建在数据表上,根据一个或多个字段创建的约束是为了保持数据的完整性,约束有非空约束,主键约束,外键约束等等。

 

10.spring是什么

这个问题,每每能够经过咱们为何要使用spring这个问题来切入:AOP让开发人员能够建立非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务(比 如日志、持久性、事务等)就能够分解成方面并应用到域对象上,同时不会增长域对象的对象模型的复杂性。 IOC 容许建立一个能够构造对象的应用环境,而后向这些对象传递它们的协做对象。正如单词倒置 所代表的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight

construction),每个对象都是用其协做对象构造的。所以是由容器管理协做对象(collaborator)。 Spring即便一个AOP框架,也是一IOC容器。Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协做对象)。而后能够很容易地在须要时替换具备相似接口的协做对象。 

 

11.用本身的话简要阐述struts2的执行流程。

Struts 2框架自己大体能够分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器 FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是须要用户来本身实现的。用户在开发Action和业务逻辑组件的同时,还须要编写相关的配置文件,供核心控制器FilterDispatcher来使用。 

 

Struts 2的工做流程相对于Struts 1要简单,与WebWork框架基本相同,因此说Struts 2是WebWork的升级版本。基本简要流程以下:一、客户端浏览器发出HTTP请求。二、根据web.xml配置,该请求被 FilterDispatcher接收。三、根据struts.xml配置,找到须要调用的Action类和方法, 并经过IoC方式,将值注入给Aciton。四、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。五、Action执行完毕,根据 struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。六、返回HTTP响应到客户端浏览器。