如何想面试官描述springmvc项目描述

面试问Spring mvc该如何回答 - Java Web开发当前位置:& &&&面试问Spring mvc该如何回答面试问Spring mvc该如何回答&&网友分享于:&&浏览:122次面试问Spring mvc该怎么回答?不是就mvc分开来回答么?那个面试官说&跟页面显示层、逻辑控制层、数据层不一样,虽然有联系。他说Spring&mvc只是页面的,都把我弄糊涂了,那该怎么回答啊,汗。。。。。
------解决方案--------------------你是不是理解错面试官的意思了&&或者我理解错你的意思了
Springmvc&是框架,和struts差不多&我觉得比struts&好用&------解决方案--------------------1.回答springmvc是什么
2.讲解springmvc的工作原理
3.讲解springmvc和struts的区别&
答到这三个方面&基本ok啦
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有1011人阅读
Java面试(5)
41& Spring MVC原理
Spring工作流程描述
1、用户向服务器发送请求,请求被Spring前端控制DispatcherServlet捕获;
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3、DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4、提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
5、Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;
6、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;
7、ViewResolver结合Model和View,来渲染视图。
8、将渲染结果返回给客户端。
42& Spring MVC的DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
43& Spring MVC WebApplicationContext
WebApplicationContext继承了ApplicationContext并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext,因为它能处理主题,并找到被关联的servlet。
44& Spring中DispatcherServlet、WebApplicationContext、ServletContext之间的关系
1、首先,对于一个Web应用来说,Web容器提供一个全局的上下文环境(servletContext),为后面的SpringIOC容器作为宿主环境。
2、然后,在web.xml中会有提供ContextLoaderListener。在web容器启动的过程当中,会监听到servletContext的变化,其contextInitialized方法会被调用。在这个方法中,Spring会启动一个跟上下文(WebApplicationContext/XmlWebApplicationContext)。这个就是SpringIOC容器,对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;
3、最后,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有springmvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是XmlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。
45& Spring MVC的注解
@Controller:该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用ServletAPI。
@RequestMapping:该注解是用来映射一个URL到一个类或一个特定的方处理法上。
@RequestParam:绑定HttpServletRequest请求参数到控制器方法参数。(默认在方法入参中按参数名绑定)
@RequestHeader:注解绑定HttpServletRequest头信息到Controller方法参数。
@CookieValue:绑定cookie的值到Controller方法参数。
46& @RequestMapping注解支持的方法参数和返回类型
& 支持的方法参数类型
(1)HttpServlet对象,主要包括HttpServletRequest、HttpServletResponse和HttpSession对象。这些参数Spring在调用处理器方法的时候会自动给它们赋值,所以当在处理器方法中需要使用到这些对象的时候,可以直接在方法上给定一个方法参数的申明,然后在方法体里面直接用就可以了。但是有一点需要注意的是在使用HttpSession对象的时候,如果此时HttpSession对象还没有建立起来的话就会有问题。
(2)Spring自己的WebRequest对象。使用该对象可以访问到存放在HttpServletRequest和HttpSession中的属性值。
(3)InputStream、OutputStream、Reader和Writer。InputStream和Reader是针对HttpServletRequest
而言的,可以从里面取数据;OutputStream和Writer 是针对HttpServletResponse而言的,可以往里面写数据。
(4)使用@PathVariable、@RequestParam、@CookieValue和@RequestHeader标记的参数。
(5)使用@ModelAttribute标记的参数。
(6)java.util.Map、Spring封装的Model和ModelMap。这些都可以用来封装模型数据,用来给视图做展示。
(7)实体类。可以用来接收上传的参数。
(8)Spring封装的MultipartFile。用来接收上传文件的。
(9)Spring封装的Errors和BindingResult对象。这两个对象参数必须紧接在需要验证的实体对象参数之后,它里面包含了实体对象的验证结果。
& 支持的返回类型
(1)一个包含模型和视图的ModelAndView对象。
(2)一个模型对象,这主要包括Spring封装好的Model和ModelMap
,以及java.util.Map,当没有视图返回的时候视图名称将由RequestToViewNameTranslator来决定。
(3)一个View对象。这个时候如果在渲染视图的过程中模型的话就可以给处理器方法定义一个模型参数,然后在方法体里面往模型中添加值。
(4)一个String字符串。这往往代表的是一个视图名称。这个时候如果需要在渲染视图的过程中需要模型的话就可以给处理器方法一个模型参数,然后在方法体里面往模型中添加值就可以了。
(5)返回值是void。这种情况一般是我们直接把返回结果写到HttpServletResponse中了,如果没有写的话,那么Spring将会利用RequestToViewNameTranslator来返回一个对应的视图名称。如果视图中需要模型的话,处理方法与返回字符串的情况相同。
(6)如果处理器方法被注解@ResponseBody标记的话,那么处理器方法的任何返回类型都会通过HttpMessageConverters转换之后写到HttpServletResponse中,而不会像上面的那些情况一样当做视图或者模型来处理。
(7)除以上几种情况之外的其他任何返回类型都会被当做模型中的一个属性来处理,而返回的视图还是由RequestToViewNameTranslator来决定,添加到模型中的属性名称可以在该方法上用@ModelAttribute(“attributeName”)来定义,否则将使用返回类型的类名称的首字母小写形式来表示。使用@ModelAttribute标记的方法会在@RequestMapping
标记的方法执行之前执行。
47& @ModelAttribute和@SessionAttributes传递和保存数据
SpringMVC支持使用@ModelAttribute和@SessionAttributes在不同的模型和控制器之间共享数据。
& @ModelAttribute:一种是标注在方法上,另一种是标注在Controller方法参数上。
当@ModelAttribute标记单独使用时,被标注的方法将在处理器方法执行之前执行,然后把返回的对象存放在模型属性中,传给标注在方法入参上的变量。
& @SessionAttributes:用于标记需要在Session中使用到的数据,包括从Session中取数据和存数据。@SessionAttributes一般是标记在Controller类上的,可以通过名称、类型或者名称加类型的形式来指定哪些属性是需要存放在session中的。
当使用@SessionAttributes时,如没有@ModelAttribute标注的方法,则去session中寻找。当controller类中的方法的变量,能匹配到@SessionAttributes中的名称或类型时,在方法返回后会将变量存放在Session中。
48& Spring MVC 自定义数据类型转换
Spring 3.0以后,可以继承org.springframework.core.convert.converter接口,实现对应的转换器,然后,
1、通过XMLSchema注册到ConversionService。
2、通过ConfigurableWebBindingInitializer注册ConversionService。
3、注册ConfigurableWebBindingInitializer到RequestMappingHandlerAdapter。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45500次
排名:千里之外
原创:41篇
转载:24篇
(3)(7)(2)(8)(1)(7)(4)(3)(1)(5)(6)(13)(4)(1)您还可以使用以下方式登录
当前位置:&>&&>&&>& > spring基础知识汇总及常见面试题目总结
spring mvc常见面试题 spring基础知识汇总及常见面试题目总结
Spring简介Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。Spring总结起来优点如下:低侵入式设计,代码的污染极低。独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。Spring框架的组成结构图如下所示:Spring的核心机制管理Bean程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。public class BeanTest{
public static void main(String args[]) throws Exception{
ApplicationContext ctx = new ClassPathXmlApplicationContext(&beans.xml&);
Person p = ctx.getBean(&person&, Person.class);
}}​Eclipse使用Spring在Eclipse等IDE工具中,用户可以自建User Library,然后把Spring的Jar包都放入其中,当然也可以将Jar包直接放在项目的/WEB-INF/lib目录下,但是如果使用User Library,在项目发布时,需要将用户库所引用的Jar文件随应用一起发布,就是将User Library所使用的Jar复制到/WEB-INF/lib目录下,这是因为对于一个Web应用,Eclipse部署Web应用时不会将用户库的Jar文件复制到/WEB-INF/lib下,需要手动复制。依赖注入Spring框架的核心功能有两个:Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为&依赖注入&的方式来管理Bean之间的依赖关系。使用依赖注入,不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用。依赖注入是一种优秀的解耦方式,其可以让Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。理解依赖注入Rod Johnson是第一个高度重视以配置文件来管理Java实例的协作关系的人,他给这种方式起了一个名字:控制反转(Inverse of Control,IoC)。后来Martine Fowler为这种方式起了另一个名称:依赖注入(Dependency Injection),因此不管是依赖注入,还是控制反转,其含义完全相同。当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,在传统模式下通常有两种做法:原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。注意上面的主动二字,这必然会导致调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受&&所以Rod Johnson称之为控制反转。另外从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量&&相当于为调用者注入它依赖的实例,因此Martine Fowler称之为依赖注入。设值注入设值注入是指IoC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。构造注入利用构造器来设置依赖关系的方式,被称为构造注入。通俗来说,就是驱动Spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化&&这就是构造注入的本质。两种注入方式的对比设值注入有如下优点:与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受。通过setter方法设定依赖关系显得更加直观、自然。对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。尤其在某些成员变量可选的情况下,多参数的构造器更加笨重。构造注入优势如下:构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。对于依赖关系无需变化的Bean,构造注入更有用处。因为没有setter方法,所有的依赖关系全部在构造器内设定,无须担心后续的代码对依赖关系产生破坏。依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系,对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。注意:建议采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。Spring容器中的Bean对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成&依赖注入&&&这就是所谓IoC的本质。容器中Bean的作用域当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下五种作用域:singleton: 单例模式,在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例。prototype: 每次通过容器的getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例。request: 对于一次HTTP请求,request作用域的Bean将只生成一个实例,这意味着,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。对于一次HTTP会话,session作用域的Bean将只生成一个实例,这意味着,在同一次HTTP会话内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。global session: 每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效。如果不指定Bean的作用域,Spring默认使用singleton作用域。prototype作用域的Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成果,就可以重复使用。因此,应该尽量避免将Bean设置成prototype作用域。使用自动装配注入合作者BeanSpring能自动装配Bean与Bean之间的依赖关系,即无须使用ref显式指定依赖Bean,而是由Spring容器检查XML配置文件内容,根据某种规则,为调用者Bean注入被依赖的Bean。Spring自动装配可通过元素的default-autowire属性指定,该属性对配置文件中所有的Bean起作用;也可通过对元素的autowire属性指定,该属性只对该Bean起作用。autowire和default-autowire可以接受如下值:no: 不使用自动装配。Bean依赖必须通过ref元素定义。这是默认配置,在较大的部署环境中不鼓励改变这个配置,显式配置合作者能够得到更清晰的依赖关系。byName: 根据setter方法名进行自动装配。Spring容器查找容器中全部Bean,找出其id与setter方法名去掉set前缀,并小写首字母后同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入。byType: 根据setter方法的形参类型来自动装配。Spring容器查找容器中的全部Bean,如果正好有一个Bean类型与setter方法的形参类型匹配,就自动注入这个Bean;如果找到多个这样的Bean,就抛出一个异常;如果没有找到这样的Bean,则什么都不会发生,setter方法不会被调用。constructor: 与byType类似,区别是用于自动匹配构造器的参数。如果容器不能恰好找到一个与构造器参数类型匹配的Bean,则会抛出一个异常。autodetect: Spring容器根据Bean内部结构,自行决定使用constructor或byType策略。如果找到一个默认的构造函数,那么就会应用byType策略。当一个Bean既使用自动装配依赖,又使用ref显式指定依赖时,则显式指定的依赖覆盖自动装配依赖;对于大型的应用,不鼓励使用自动装配。虽然使用自动装配可减少配置文件的工作量,但大大将死了依赖关系的清晰性和透明性。依赖关系的装配依赖于源文件的属性名和属性类型,导致Bean与Bean之间的耦合降低到代码层次,不利于高层次解耦。创建Bean的3种方式使用构造器创建Bean实例使用构造器来创建Bean实例是最常见的情况,如果不采用构造注入,Spring底层会调用Bean类的无参数构造器来创建实例,因此要求该Bean类提供无参数的构造器。采用默认的构造器创建Bean实例,Spring对Bean实例的所有属性执行默认初始化,即所有的基本类型的值初始化为0或false;所有的引用类型的值初始化为null。使用静态工厂方法创建Bean使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类,Spring通过该属性知道由哪个工厂类来创建Bean实例。除此之外,还需要使用factory-method属性来指定静态工厂方法,Spring将调用静态工厂方法返回一个Bean实例,一旦获得了指定Bean实例,Spring后面的处理步骤与采用普通方法创建Bean实例完全一样。如果静态工厂方法需要参数,则使用元素指定静态工厂方法的参数。调用实例工厂方法创建Bean实例工厂方法与静态工厂方法只有一个不同:调用静态工厂方法只需使用工厂类即可,而调用实例工厂方法则需要工厂实例。使用实例工厂方法时,配置Bean实例的元素无须class属性,配置实例工厂方法使用factory-bean指定工厂实例。采用实例工厂方法创建Bean的元素时需要指定如下两个属性:factory-bean: 该属性的值为工厂Bean的id。factory-method: 该属性指定实例工厂的工厂方法。若调用实例工厂方法时需要传入参数,则使用元素确定参数值。协调作用域不同步的Bean当singleton作用域的Bean依赖于prototype作用域的Bean时,会产生不同步的现象,原因是因为当Spring容器初始化时,容器会预初始化容器中所有的singleton Bean,由于singleton Bean依赖于prototype Bean,因此Spring在初始化singleton Bean之前,会先创建prototypeBean&&然后才创建singleton Bean,接下里将prototype Bean注入singleton Bean。解决不同步的方法有两种:放弃依赖注入: singleton作用域的Bean每次需要prototype作用域的Bean时,主动向容器请求新的Bean实例,即可保证每次注入的prototype Bean实例都是最新的实例。利用方法注入: 方法注入通常使用lookup方法注入,使用lookup方法注入可以让Spring容器重写容器中Bean的抽象或具体方法,返回查找容器中其他Bean的结果,被查找的Bean通常是一个non-singleton Bean。Spring通过使用JDK动态代理或cglib库修改客户端的二进制码,从而实现上述要求。建议采用第二种方法,使用方法注入。为了使用lookup方法注入,大致需要如下两步:将调用者Bean的实现类定义为抽象类,并定义一个抽象方法来获取被依赖的Bean。在元素中添加子元素让Spring为调用者Bean的实现类实现指定的抽象方法。注意:Spring会采用运行时动态增强的方式来实现元素所指定的抽象方法,如果目标抽象类实现过接口,Spring会采用JDK动态代理来实现该抽象类,并为之实现抽象方法;如果目标抽象类没有实现过接口,Spring会采用cglib实现该抽象类,并为之实现抽象方法。Spring4.0的spring-core-xxx.jar包中已经集成了cglib类库。两种后处理器Spring提供了两种常用的后处理器:Bean后处理器: 这种后处理器会对容器中Bean进行后处理,对Bean进行额外加强。容器后处理器: 这种后处理器会对IoC容器进行后处理,用于增强容器功能。Bean后处理器Bean后处理器是一种特殊的Bean,这种特殊的Bean并不对外提供服务,它甚至可以无须id属性,它主要负责对容器中的其他Bean执行后处理,例如为容器中的目标Bean生成代理等,这种Bean称为Bean后处理器。Bean后处理器会在Bean实例创建成功之后,对Bean实例进行进一步的增强处理。Bean后处理器必须实现BeanPostProcessor接口,同时必须实现该接口的两个方法。Object postProcessBeforeInitialization(Object bean, String name) throws BeansException: 该方法的第一个参数是系统即将进行后处理的Bean实例,第二个参数是该Bean的配置idObject postProcessAfterinitialization(Object bean, String name) throws BeansException: 该方法的第一个参数是系统即将进行后处理的Bean实例,第二个参数是该Bean的配置id容器中一旦注册了Bean后处理器,Bean后处理器就会自动启动,在容器中每个Bean创建时自动工作,Bean后处理器两个方法的回调时机如下图:注意一点,如果使用BeanFactory作为Spring容器,则必须手动注册Bean后处理器,程序必须获取Bean后处理器实例,然后手动注册。BeanPostProcessor bp = (BeanPostProcessor)beanFactory.getBean(&bp&);beanFactory.addBeanPostProcessor(bp);Person p = (Person)beanFactory.getBean(&person&);容器后处理器Bean后处理器负责处理容器中的所有Bean实例,而容器后处理器则负责处理容器本身。容器后处理器必须实现BeanFactoryPostProcessor接口,并实现该接口的一个方法postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)实现该方法的方法体就是对Spring容器进行的处理,这种处理可以对Spring容器进行自定义扩展,当然也可以对Spring容器不进行任何处理。类似于BeanPostProcessor,ApplicationContext可自动检测到容器中的容器后处理器,并且自动注册容器后处理器。但若使用BeanFactory作为Spring容器,则必须手动调用该容器后处理器来处理BeanFactory容器。Spring的&零配置&支持搜索Bean类Spring提供如下几个Annotation来标注Spring Bean:@Component: 标注一个普通的Spring Bean类@Controller: 标注一个控制器组件类@Service: 标注一个业务逻辑组件类@Repository: 标注一个DAO组件类在Spring配置文件中做如下配置,指定自动扫描的包:使用@Resource配置依赖@Resource位于javax.annotation包下,是来自JavaEE规范的一个Annotation,Spring直接借鉴了该Annotation,通过使用该Annotation为目标Bean指定协作者Bean。使用@Resource与元素的ref属性有相同的效果。@Resource不仅可以修饰setter方法,也可以直接修饰实例变量,如果使用@Resource修饰实例变量将会更加简单,此时Spring将会直接使用JavaEE规范的Field注入,此时连setter方法都可以不要。使用@PostConstruct和@PreDestroy定制生命周期行为@PostConstruct和@PreDestroy同样位于javax.annotation包下,也是来自JavaEE规范的两个Annotation,Spring直接借鉴了它们,用于定制Spring容器中Bean的生命周期行为。它们都用于修饰方法,无须任何属性。其中前者修饰的方法时Bean的初始化方法;而后者修饰的方法时Bean销毁之前的方法。Spring4.0增强的自动装配和精确装配Spring提供了@Autowired注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。当使用@Autowired标注setter方法时,默认采用byType自动装配策略。在这种策略下,符合自动装配类型的候选Bean实例常常有多个,这个时候就可能引起异常,为了实现精确的自动装配,Spring提供了@Qualifier注解,通过使用@Qualifier,允许根据Bean的id来执行自动装配。Spring的AOP为什么需要AOPAOP(Aspect Orient Programming)也就是面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。其实AOP问世的时间并不太长,AOP和OOP互为补充,面向切面编程将程序运行过程分解成各个切面。AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。使用AspectJ实现AOPAspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想。其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题;另一个部分是工具部分,包括编译、调试工具等。AOP实现可分为两类:静态AOP实现: AOP框架在编译阶段对程序进行修改,即实现对目标类的增强,生成静态的AOP代理类,以AspectJ为代表。动态AOP实现: AOP框架在运行阶段动态生成AOP代理,以实现对目标对象的增强,以Spring AOP为代表。一般来说,静态AOP实现具有较好的性能,但需要使用特殊的编译器。动态AOP实现是纯Java实现,因此无须特殊的编译器,但是通常性能略差。AOP的基本概念关于面向切面编程的一些术语:切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有&around&、&before&和&after&等类型切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。Spring的AOP支持Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。为了在应用中使用@AspectJ支持,Spring需要添加三个库:aspectjweaver.jaraspectjrt.jaraopalliance.jar​并在Spring配置文件中做如下配置:&aop:aspectj-autoproxy&&context:component-scan base-package=&edu.shu.sprint.service&&
&context:include-filter type=&annotation& expression=&org.aspectj.lang.annotation.Aspect&&&/context:include-filter&&/context:component-scan&&/aop:aspectj-autoproxy&69道Spring面试题和答案Spring概述1.什么是spring?Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。2.使用Spring框架的好处是什么?&轻量:Spring是轻量的,基本的版本大约2MB。&控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。&面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。&容器:Spring包含并管理应用中对象的生命周期和配置。&MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。&事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。&异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的unchecked异常。3.Spring由哪些模块组成?以下是Spring框架的基本模块:&Coremodule&Beanmodule&Contextmodule&ExpressionLanguagemodule&JDBCmodule&ORMmodule&OXMmodule&JavaMessagingService(JMS)module&Transactionmodule&Webmodule&Web-Servletmodule&Web-Strutsmodule&Web-Portletmodule4. 核心容器(应用上下文)模块。这是基本的Spring模块,提供spring框架的基础功能,BeanFactory是任何以spring为基础的应用的核心。Spring框架建立在此模块之上,它使Spring成为一个容器。5.BeanFactory&BeanFactory实现举例。Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的BeanFactory实现是XmlBeanFactory类。6.XMLBeanFactory最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中的定义加载beans。该容器从XML文件读取配置元数据并用它去创建一个完全配置的系统或应用。7.解释AOP模块AOP模块用于发给我们的Spring应用做面向切面的开发,很多支持由AOP联盟提供,这样就确保了Spring和其他AOP框架的共通性。这个模块将元数据编程引入Spring。8.解释JDBC抽象和DAO模块。通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP模块给Spring应用中的对象提供事务管理服务。9.解释对象/关系映射集成模块。Spring通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,Spring支持集成主流的ORM框架,如Hiberate,JDO和iBATISSQLMaps。Spring的事务管理同样支持以上所有ORM框架及JDBC。10.解释WEB模块。Spring的WEB模块是构建在applicationcontext模块基础之上,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对JakartaStruts的支持。12.Spring配置文件Spring配置文件是个XML文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。13.什么是SpringIOC容器?SpringIOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。14.IOC的优点是什么?IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。15.ApplicationContext通常的实现是什么?&FileSystemXmlApplicationContext:此容器从一个XML文件中加载beans的定义,XMLBean配置文件的全路径名必须提供给它的构造函数。&ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。&WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。16.Bean工厂和Applicationcontexts有什么区别?Applicationcontexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Applicationcontexts中以声明的方式处理。Applicationcontexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。17.一个Spring的应用看起来象什么?&一个定义了一些功能的接口。&这实现包括属性,它的Setter , getter方法和函数等。&SpringAOP。&Spring的XML配置文件。&使用以上功能的客户端程序。依赖注入18.什么是Spring的依赖注入?依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。19.有哪些不同类型的IOC(依赖注入)方式?&构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。&Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。20.哪种依赖注入方式你建议使用,构造器注入,还是Setter方法注入?你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。SpringBeans21.什么是Springbeans?Springbeans是那些形成Spring应用的主干的java对象。它们被SpringIOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中的形式定义。Spring框架定义的beans都是单件beans。在beantag中有个属性&singleton&,如果它被赋为TRUE,bean就是单件,否则就是一个prototypebean。默认是TRUE,所以所有在Spring框架中的beans缺省都是单件。22.一个SpringBean定义包含什么?一个SpringBean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。23.如何给Spring容器提供配置元数据?这里有三种重要的方法给Spring容器提供配置元数据。XML配置文件。基于注解的配置。基于java的配置。24.你怎样定义类的作用域?当定义一个在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope属性必须设为singleton。25.解释Spring支持的几种bean的作用域。Spring框架支持以下五种bean的作用域:&singleton:bean在每个Springioc容器中只有一个实例。&prototype:一个bean的定义可以有多个实例。&request:每次http请求都会创建一个bean,该作用域仅在基于web的SpringApplicationContext情形下有效。&session:在一个HTTPSession中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。&global-session:在一个全局的HTTPSession中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。缺省的Springbean的作用域是Singleton.26.Spring框架中的单例bean是线程安全的吗?不,Spring框架中的单例bean不是线程安全的。27.解释Spring框架中bean的生命周期。&Spring容器从XML文件中读取bean的定义,并实例化bean。&Spring根据bean的定义填充所有的属性。&如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。&如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。&如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。&如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。&如果有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization()方法将被调用。&如果bean实现了DisposableBean,它将调用destroy()方法。28.哪些是重要的bean生命周期方法?你能重载它们吗?有两个重要的bean生命周期方法,第一个是setup,它是在容器加载bean的时候被调用。第二个方法是teardown它是在容器卸载类的时候被调用。Thebean标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。29.什么是Spring的内部bean?当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义innerbean,在Spring的基于XML的配置元数据中,可以在或元素内使用元素,内部bean通常是匿名的,它们的Scope一般是prototype。30.在Spring中如何注入一个java集合?Spring提供以下几种集合的配置元素:&类型用于注入一列值,允许有相同的值。&类型用于注入一组值,不允许有相同的值。&类型用于注入一组键值对,键和值都可以为任意类型。&类型用于注入一组键值对,键和值都只能为String类型。31.什么是bean装配?装配,或bean装配是指在Spring容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。32.什么是bean的自动装配?Spring容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。33.解释不同方式的自动装配。有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。&no:默认的方式是不进行自动装配,通过显式设置ref属性来进行装配。&byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。&byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。&constructor:这个方式类似于byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。&autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。34.自动装配有哪些局限性?自动装配的局限性是:&重写:你仍需用和配置来定义依赖,意味着总要重写自动装配。&基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。&模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。35.你可以在Spring中注入一个null和一个空字符串吗?可以。Spring注解36.什么是基于Java的Spring注解配置?给一些注解的例子.基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。以@Configuration注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。37.什么是基于注解的容器配置?相对于XML文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。38.怎样开启注解装配?注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置元素。39.@Required注解这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。40.@Autowired注解@Autowired注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。41.@Qualifier注解当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier注解和@Autowire注解结合使用以消除这种混淆,指定需要装配的确切的bean。Spring数据访问42.在Spring框架中如何更有效地使用JDBC?使用SpringJDBC框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements和queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate(例子见这里here)43.JdbcTemplateJdbcTemplate类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。44.Spring对DAO的支持Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,HibernateorJDO结合使用。这使我们可以方便切换持久层。编码时也不用担心会捕获每种技术特有的异常。45. 使用Spring通过什么方式访问Hibernate?在Spring中有两种方式访问Hibernate:&控制反转HibernateTemplate和Callback。&继承HibernateDAOSupport提供一个AOP拦截器。46.Spring支持的ORMSpring支持以下ORM:&Hibernate&iBatis&JPA(JavaPersistenceAPI)&TopLink&JDO(JavaDataObjects)&OJB47.如何通过HibernateDaoSupport将Spring和Hibernate结合起来?用Spring的SessionFactory调用LocalSessionFactory。集成过程分三步:&配置theHibernateSessionFactory。&继承HibernateDaoSupport实现一个DAO。&在AOP支持的事务中装配。48.Spring支持的事务管理类型Spring支持两种类型的事务管理:&编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。&声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。49.Spring框架的事务管理有哪些优点?&它为不同的事务API如JTA,JDBC,Hibernate,JPA和JDO,提供一个不变的编程模式。&它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如&它支持声明式事务管理。&它和Spring各种数据访问抽象层很好得集成。50.你更倾向用那种事务管理类型?大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。Spring面向切面编程(AOP)51.解释AOP面向切面的编程,或AOP,是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。52.Aspect切面AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在SpringAOP中,切面通过带有@Aspect注解的类实现。52.在SpringAOP中,关注点和横切关注的区别是什么?关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。54.连接点连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行SpringAOP的位置。55.通知通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用五种类型的通知:&before:前置通知,在一个方法执行前被调用。&after:在方法执行之后调用的通知,无论方法执行是否成功。&after-returning:仅当方法成功完成后执行的通知。&after-throwing:在方法抛出异常退出时执行的通知。&around:在方法执行之前和之后调用的通知。56.切点切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。57.什么是引入?引入允许我们在已存在的类中增加新的方法和属性。58.什么是目标对象?被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。59.什么是代理?代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。60.有几种不同类型的自动代理?BeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreatorMetadataautoproxying61.什么是织入。什么是织入应用的不同点?织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。织入可以在编译时,加载时,或运行时完成。62.解释基于XMLSchema方式的切面实现。在这种情况下,切面由常规类以及基于XML的配置实现。63.解释基于注解的切面实现在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。Spring的MVC64.什么是Spring的MVC框架?Spring配备构建Web应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。65.DispatcherServletSpring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。66.WebApplicationContextWebApplicationContext继承了ApplicationContext并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext,因为它能处理主题,并找到被关联的servlet。67.什么是SpringMVC框架的控制器?控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。68.@Controller注解该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用ServletAPI。69.@RequestMapping注解该注解是用来映射一个URL到一个类或一个特定的方处理法上。&就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    }

我要回帖

更多关于 springmvc如何重定向 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信