java面试题-spring

来源:互联网 发布:怎样评价携程 知乎 编辑:程序博客网 时间:2024/05/05 00:20

Spring组成

Spring core:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring Context:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP:通过配置管理特性,Spring AOP模块直接将面向切面的编程功能集成到了 Spring 框架中。Spring AOP模块为基于Spring的应用程序提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。

Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。

Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate 和 MyBatis SQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。

Spring Web模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以Spring 框架支持与Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。


Spring的核心功能

控制反转IoC(Inversion of Control):IoC是一种设计思想,就是由容器来负责控制对象的生命周期和对象间的关系,而不是我们在编码中创建对象和对象的依赖关系,再通过DI(依赖注入)动态的向某个对象提供它所需要的其他对象。

面向切面编程(AOP)Aspect Oriented ProgrammingAOP主要实现的目的是针对业务处理过程中的切面进行提取在切面的纵向定义处理方法,处理完成之后,回到横向业务流就是实现在一个方法执行前先执行一段处理代码或一个方法执行后执行一段代码。


Spring启动过程

1. 首先在java web项目启动时,容器会读取配置文件web.xml,首先读取配置文件中的<listener>和<context-param>两个节点容器创建ServletContext,将<context-param>转化为键值对,并交给ServletContext容器创建<listener>中的类实例,ContextLoaderListener被创建

2. 在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用在这个方法中,spring会初始化根上下文WebApplicationContext,这是一个接口类,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后将其存储到ServletContext中

3. spring初始化时创建了WebApplicationContext,在WebApplicationContext中构建了一个BeanFactory(默认是DefaultListableBeanFactory),在该类的子类xmlBeanFactory中解析xml文件中所有的bean,并将bean放到BeanDefinitionHolder中,封装成BeanDefinition。

4. 获取bean,如果bean存在则直接返回;如果不存在则通过反射创建该bean并计算该bean的依赖关系。


springMVC工作过程

1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet

2.DipatcherServlet根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)HandlerMapping的配置找到处理请求的处理器(Handler)将处理权交给HandlerHandler将具体的处理进行封装,再由具体的HandlerAdapter对Handler进行具体的调用。

3.Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServletDispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View并返回给客户端。


spring事物传播行为

PROPAGATION_REQUIRED:表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务

PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行

PROPAGATION_MANDATORY:表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常

PROPAGATION_REQUIRED_NEW:表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

PROPAGATION_NOT_SUPPORTED:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

PROPAGATION_NEVER:表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常

PROPAGATION_NESTED:表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务


Spring Bean的作用域

在Spring中创建一个bean的时候,我们可以声明它的作用域。只需要在bean定义的时候通过scope属性定义即可。

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

Prototype: 原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态。

Request: 请求范围,对于每一个不同的Http请求将创建一个bean的实例,在请求完成以后,该bean就会被销毁。

Session: 对于每一个session创建一个bean的实例,在session过期后,bean会随之失效。 
global-session 在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。