Spring中常见⾯试题
什么是Spring
Spring是⼀个开源的Java EE开发框架。Spring框架的核⼼功能可以应⽤在任何Java应⽤程序中,但对Java EE平台上的Web应⽤程序有更好的扩展性。Spring框架的⽬标是使得Java EE应⽤程序的开发更加简捷,通过使⽤POJO为基础的编程模型促进良好的编程风格。
Spring有哪些优点
轻量级:Spring在⼤⼩和透明性⽅⾯绝对属于轻量级的,基础版本的Spring框架⼤约只有2MB。
控制反转(IOC):Spring使⽤控制反转技术实现了松耦合。依赖被注⼊到对象,⽽不是创建或寻依赖对象。
⾯向切⾯编程(AOP): Spring⽀持⾯向切⾯编程,同时把应⽤的业务逻辑与系统的服务分离开来。
容器:Spring包含并管理应⽤程序对象的配置,依赖关系和⽣命周期。
MVC框架:Spring的web框架是⼀个设计优良的web MVC框架,很好的取代了⼀些web框架。
事务管理:Spring对下⾄本地业务上⾄全局业务(JAT)提供了统⼀的事务管理接⼝。
异常处理:Spring提供⼀个⽅便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为⼀致的、Unchecked异常。
Spring框架有哪些模块
Spring框架⾄今已集成了20多个模块。这些模块主要被分如下图所⽰的核⼼容器、数据访问/集成、Web、AOP(⾯向切⾯编程)、⼯具、消息和测试模块。
核⼼容器模块:是spring中最核⼼的模块。负责Bean的创建,配置和管理。主要包括:beans,core,context,expression等模块。
Spring的AOP模块:主要负责对⾯向切⾯编程的⽀持,帮助应⽤对象解耦。
数据访问和集成模块:包括JDBC,ORM,OXM,JMS和事务处理模块,其细节如下: JDBC模块提供了不再需要冗长的JDBC编码相关了JDBC的抽象层。 ORM模块提供的集成层。流⾏的对象关系映射API,包括JPA,JDO,Hibernate和iBatis。 OXM模块提供了⼀个⽀持对象/ XML映射实现对JAXB,Castor,使⽤XMLBeans,JiBX和XStream 的抽象层。 Java消息服务JMS模块包含的功能为⽣产和消费的信息。 事务模块⽀持编程和声明式事务管理实现特殊接⼝类,并为所有的POJO。
Web和远程调⽤:包括web,servlet,struts,portlet模块。
测试模块:test
⼯具模块消息模块
什么是控制反转(IOC)?什么是依赖注⼊?
传统模式中对象的调⽤者需要创建被调⽤对象,两个对象过于耦合,不利于变化和拓展.在spring中,直接操控的对象的调⽤权交给容器,通过容器来实现对象组件的装配和管理,从⽽实现对象之间的松耦合。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本⾝转移到了外部容器。
依赖注⼊:对象⽆需⾃⾏创建或管理它们的依赖关系,IoC容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。依赖注⼊能让相互协作的软件组件保持松散耦合。
BeanFactory和ApplicationContext有什么区别?
Bean⼯⼚(BeanFactory)是Spring框架最核⼼的接⼝,提供了⾼级Ioc的配置机制.
应⽤上下⽂(ApplicationContext)建⽴在BeanFacotry基础之上,提供了更多⾯向应⽤的功能,如果国际化,属性编辑器,事件等等.
session和application的区别beanFactory是spring框架的基础设施,是⾯向spring本⾝,ApplicationContext是⾯向使⽤Spring框架的开发者,⼏乎所有场合都会⽤到ApplicationContext.
Spring有⼏种配置⽅式?
将Spring配置到应⽤开发中有以下三种⽅式:
基于XML的配置:基于注解的配置: Spring在2.5版本以后开始⽀持⽤注解的⽅式来配置依赖注⼊。可以⽤注解的⽅式来替代XML⽅式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、⽅法上或者字段声明上使⽤注解即可。注解注⼊将会被容器在XML 注⼊之前被处理,所以后者会覆盖掉前者对于同⼀个属性的处理结果
基于Java的配置: Spring对Java配置的⽀持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的⽅法将会实例化、配置和初始化⼀个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作⽤与元素类似。被@Configuration所注解的类则表⽰这个类的主要⽬的是作为bean定义的资源。被@Configuration声明的类可以通过在同⼀个类的内部调⽤@bean⽅法来设置嵌⼊bean的依赖关系。
Spring Bean的⽣命周期
Bean在Spring中的⽣命周期如下:
实例化。Spring通过new关键字将⼀个Bean进⾏实例化,JavaBean都有默认的构造函数,因此不需要提供构造参数。
填⼊属性。Spring根据xml⽂件中的配置通过调⽤Bean中的setXXX⽅法填⼊对应的属性。 事件通知。Spring依次检查Bean是否实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean接⼝,如果有的话,依次调⽤这些接⼝。
使⽤。应⽤程序可以正常使⽤这个Bean了。
销毁。如果Bean实现了DisposableBean接⼝,就调⽤其destroy⽅法。
---加载过程---
1.容器寻Bean的定义信息并且将其实例化。
2.如果允许提前暴露⼯⼚,则提前暴露这个bean的⼯⼚,这个⼯⼚主要是返回该未完全处理的bean.主要是⽤于避免单例属性循环依赖问题.
3.受⽤依赖注⼊,Spring按照Bean定义信息配置Bean的所有属性。
4.如果Bean实现了BeanNameAware接⼝,⼯⼚调⽤Bean的setBeanName()⽅法传递Bean的ID。
5.如果Bean实现了BeanFactoryAware接⼝,⼯⼚调⽤setBeanFactory()⽅法传⼊⼯⼚⾃⾝。
6.如果BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()⽅法将被调⽤。
7.如果Bean指定了init-method⽅法,它将被调⽤。
8.如果有BeanPostProcessor和Bean关联,那么它们的postProcessAfterInitialization()⽅法将被调⽤
9.最后如果配置了destroy-method⽅法则注册DisposableBean.
到这个时候,Bean已经可以被应⽤系统使⽤了,并且将被保留在Bean Factory中知道它不再需要。 有两种⽅法可以把它从Bean Factory 中删除掉。
1.如果Bean实现了DisposableBean接⼝,destory()⽅法被调⽤。
2.如果指定了订制的销毁⽅法,就调⽤这个⽅法。
Spring Bean的作⽤域之间有什么区别
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中。
请解释⾃动装配模式的区别
no:这是Spring框架的默认设置,在该设置下⾃动装配是关闭的,开发者需要⾃⾏在bean定义中⽤标签明确的设置依赖关系。
byName**:该选项可以根据bean名称设置依赖关系。当向⼀个bean中⾃动装配⼀个属性时,容器将根据bean的名称⾃动在在配置⽂件中查询⼀个匹配的bean。如果到的话,就装配这个属性,如果没到的话就报错。
byType:该选项可以根据bean类型设置依赖关系。当向⼀个bean中⾃动装配⼀个属性时,容器将根据bean的类型⾃动在在配置⽂件中查询⼀个匹配的bean。如果到的话,就装配这个属性,如果没到的话就报错。
constructor:造器的⾃动装配和byType模式类似,但是仅仅适⽤于与有构造器相同参数的bean,如果在容器中没有到与构造器参数类型⼀致的bean,那么将会抛出异常。
autodetect:该模式⾃动探测使⽤构造器⾃动装配或者byType⾃动装配。⾸先,⾸先会尝试合适的带参数的构造器,如果到的话就是⽤构造器⾃动装配,如果在bean内部没有到相应的构造器或者是⽆参构造器,容器就会⾃动选择byTpe的⾃动装配⽅式。
Spring 框架中都⽤到了哪些设计模式
代理模式—在AOP和remoting中被⽤的⽐较多。
单例模式—在spring配置⽂件中定义的bean默认为单例模式。
模板⽅法—⽤来解决代码重复的问题 ⽐如. RestTemplate, JmsTemplate, JpaTemplate。 前端控制器—Srping提供了DispatcherServlet来对请求进⾏分发。 视图帮助(View Helper )—Spring提供了⼀系列的JSP标签,⾼效宏来辅助将分散的代码整合在视图⾥。 依赖注⼊—贯穿于BeanFactory / ApplicationContext接⼝的核⼼理念。
⼯⼚模式—BeanFactory⽤来创建对象的实例。
Builder模式- ⾃定义配置⽂件的解析bean是时采⽤builder模式,⼀步⼀步地构建⼀个beanDefinition
策略模式:Spring 中策略模式使⽤有多个地⽅,如 Bean 定义对象的创建以及代理对象的创建等。这⾥主要看⼀下代理对象创建的策略模式的实现。 前⾯已经了解 Spring 的代理⽅式有两个 Jdk 动态代理和 CGLIB 代理。这两个代理⽅式的使⽤正是使⽤了策略模式。
AOP是怎么实现的
实现AOP的技术,主要分为两⼤类:
⼀是采⽤动态代理技术,利⽤截取消息的⽅式,对该消息进⾏装饰,以取代原有对象⾏为的执⾏;
⼆是采⽤静态织⼊的⽅式,引⼊特定的语法创建“⽅⾯”,从⽽使得编译器可以在编译期间织⼊有关“⽅⾯”的代码。
Spring AOP 的实现原理其实很简单:AOP 框架负责动态地⽣成 AOP 代理类,这个代理类的⽅法则由 Advice 和回调⽬标对象的⽅法所组成,并将该对象可作为⽬标对象使⽤。AOP 代理包含了⽬标对象的全部⽅法,但 AOP 代理中的⽅法与⽬标对象的⽅法存在差异,AOP ⽅法在特定切⼊点添加了增强处理,并回调了⽬标对象的⽅法。
Spring AOP使⽤动态代理技术在运⾏期织⼊增强代码。使⽤两种代理机制:
基于JDK的动态代理(JDK本⾝只提供接⼝的代理);
基于CGlib的动态代理。
1)JDK的动态代理主要涉及flect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler只是⼀个接⼝,可以通过实现该接⼝定义横切逻辑,并通过反射机制调⽤⽬标类的代码,动态的将横切逻辑与业务逻辑织在⼀起。⽽Proxy利⽤InvocationHandler动态创建⼀个符合某⼀接⼝的实例,⽣成⽬标类的代理对象。 其代理对象必须是某个接⼝的实现,它是通过在运⾏期间创建⼀个接⼝的实现类来完成对⽬标对象的代理.只能实现接⼝的类⽣成代理,⽽不能针对类
2)CGLib采⽤底层的字节码技术,为⼀个类创建⼦类,并在⼦类中采⽤⽅法拦截的技术拦截所有⽗类的调⽤⽅法,并顺势织⼊横切逻辑.它运⾏期间⽣成的代理对象是⽬标类的扩展⼦类.所以⽆法通知final的⽅法,因为它们不能被覆写.是针对类实现代理,主要是为指定的类⽣成⼀个⼦类,覆盖其中⽅法.
在spring中默认情况下使⽤JDK动态代理实现AOP,如果proxy-target-class设置为true或者使⽤了优化策略那么会使⽤CGLIB来创建动态代理.Spring AOP在这两种⽅式的实现上基本⼀样.以JDK代理为例,会使⽤JdkDynamicAopProxy来创建代理,在invoke()⽅法⾸先需要织⼊到当前类的增强器封装到链中,然后递归的调⽤这些完成功能的织⼊.最终返回代理对象.
介绍spring的IOC实现
Spring IOC主要负责创建和管理bean及bean之间的依赖关系.
Spring IOC的可分为:IOC容器的初始化和bean的加载.
在IOC容器阶段主要是完成资源的加载(如定义bean的xml⽂件),bean的解析及对解析后得到的beanDefinition的进⾏注册.以xmlBeanFactory为例,XmlBeanFactory继承了DefaultListableBeanFactory,XmlBeanFactory将读取xml配置⽂件,解析bean和注册解析后的beanDefinition⼯作交给XmlBeanDefinitionReader(是BeanDefinitionReader接⼝的⼀个个性化实现)来执⾏.spring中定义了⼀套资源类,将⽂件,class等都看做资源.
1)所以⾸先是将xml⽂件转化为资源然后⽤EncodeResouce来封装,该功能主要时考虑Resource可能存在编码要求的情况,如UTF-8等.
2)然后根据xml⽂件判断xml的约束模式,是DTD还是Schema,以及寻模式⽂档(验证⽂件)的⽅法(EntityResolver,这部分采⽤了代理模式和策略模式). 完成了前⾯所有的准备⼯作以后就可以正式的加载配置⽂件,获取Docoment和解析注册BeanDefinition.Docoment 的获取以及BeanDefinition的解析注册并不是由XmlBeanDefinitionReader完成,XmlBeanDefinitionReader只是将前⾯的⼯作完成以后⽂档加载交给DefaultDocumentLoader类来完成.⽽解析交给了DefaultBeanDefinitionDocumentReader来处理.bean标签可以分为两种,⼀种是spring⾃带的默认标签,另⼀种就是⽤户⾃定义的标签.所以spring针对这两种情况,提供了不同的解析⽅式. 每种bean的解析完成后都会先注册到容器中然后最后发出响应事件,通知相关的这个bean已经注册完成了.
springMVC流程具体叙述下
当应⽤启动时,容器会加载servlet类并调⽤init⽅法. 在这个阶段,DispatcherServlet在init()完成初始化参数init-param的解析和封装,相关配置,spring的WebApplicationContext的初始化即完成xml⽂件的加载,bean的解析和注册等⼯作,另外为servlet功能所⽤的变量进⾏初始化,如:handlerMapping,viewResolvers等.
当⽤户发送⼀个请求时,⾸先根据请求的类型调⽤DispatcherServlet不同的⽅法,这些⽅法都会转发到doService()中执⾏.在该⽅法内部完成以下⼯作:
1)spring⾸先考虑multipart的处理,如果是MultipartContent类型的request,则将该请求转换成MultipartHttpServletRequest类型的request.
2)根据request信息获取对应的Handler. ⾸先根据request获取访问路径,然后根据该路径可以选择直接匹配或通⽤匹配的⽅式寻Handler,即⽤户定义的controller. Handler在init()⽅法时已经完成加载且保存到Map中了,只要根据路径就可以得到对应的Handler. 如果不存在则尝试使⽤默认的Handler. 如果还是没有到那么就通过response向⽤户返回错误信息.到handler后会将其包装在⼀个执⾏链中,然后将所有的也加⼊到该链中.
4)如果存在handler则根据当前的handler寻对应的HandlerAdapter. 通过遍历所有适配器来选择合适的适配器.
5)SpringMVC允许你通过处理Web请求,进⾏前置处理和后置处理.所以在正式调⽤ Handler的逻辑⽅法时,先执⾏所有的preHandle()⽅法.
6)正式执⾏handle的业务逻辑⽅法handle(),返回ModelAndView.逻辑处理是通过适配器调⽤handle并返回视图.这过程其实是调⽤⽤户controller的业务逻辑.
8)调⽤的postHandle()⽅法,完成后置处理.
9)根据视图进⾏页⾯跳转.该过程⾸先会根据视图名字解析得到视图,该过程⽀持缓存,如果缓存中存在则直接获取,否则创建新的视图并在⽀持缓存的情况下保存到缓冲中.
10)过程完成了像添加前缀后缀,设置必须的属性等⼯作.最后就是进⾏页⾯跳转处理.
11)调⽤的afterComplection()
AOP相关概念
⽅⾯(Aspect):⼀个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应⽤中⼀个很好的横切关注点例⼦。⽅⾯⽤Spring的 Advisor或实现。
连接点(Joinpoint): 程序执⾏过程中明确的点,如⽅法的调⽤或特定的异常被抛出。
通知(Advice):在特定的连接点,AOP框架执⾏的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下⾯讨论。许多AOP框架包括Spring都是以做通知模型,维护⼀个“围绕”连接点的链。Spring中定义了4个
advice.Interception Around(MethodInterceptor)、Before(MethodBeforeAdvice)、After Returning(AfterReturningAdvice)、After(AfterAdvice)。
切⼊点(Pointcut): ⼀系列连接点的集合。AOP框架必须允许开发者指定切⼊点:例如,使⽤正则表达式。 Spring定义了Pointcut接⼝,⽤来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是⽤来检查⽬标类的⽅法是否可以被应⽤此通知,⽽ClassFilter是⽤来检查Pointcut是否应该应⽤到⽬标类上
引⼊(Introduction): 添加⽅法或字段到被通知的类。 Spring允许引⼊新的接⼝到任何被通知的对象。例如,你可以使⽤⼀个引⼊使任何对象实现 IsModified接⼝,来简化缓存。Spring中要使⽤Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接⼝
⽬标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。
POJOAOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
织⼊(Weaving): 组装⽅⾯来创建⼀个被通知对象。这可以在编译时完成(例如使⽤AspectJ编译器),也可以在运⾏时完成。Spring和其他纯Java AOP框架⼀样,在运⾏时完成织⼊。
过滤器与的区别
请描述⼀下java事件监听机制。
(1) Java的事件监听机制涉及到三个组件:事件源、事件、事件对象
(2) 当事件源上发⽣操作时,它将会调⽤事件的⼀个⽅法,并在调⽤这个⽅法时,会传递事件对象过来
(3) 事件由开发⼈员编写,开发⼈员在事件中,通过事件对象可以拿到事件源,从⽽对事件源上的操作进⾏处理。
解释核⼼容器(应⽤上下⽂)模块
这是Spring的基本模块,它提供了Spring框架的基本功能。BeanFactory 是所有Spring应⽤的核⼼。Spring框架是建⽴在这个模块之上的,这也使得Spring成为⼀个容器。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。