java面试题收集(11)---MVC、IOC容器常用的接口和具体的实现类、Spring 声明式事务中@Transaction、REST中的四种请求方式

91 阅读11分钟

1、详细描述MVC

基于java的web应用系统采用MVC设计模型,即用Model(模型)、View(视图)和Controller(控制)分离设计,这是目前web应用服务系统的主流设置方向。 Model: 处理业务逻辑的模块。 View: 负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。 Controller: 负责每个请求的分发,把Form数据传递给Model进行处理,处理完成后,把处理结果返回给相应的View显示给用户。

2、简述Spring中IOC容器常用的接口和具体的实现类

(1)BeanFactory SpringIOC容器的基本设置,是最底层的实现,面向框架本身的。

(2)ApplicationContext BeanFactory的子接口,提供了更多高级的特定.面向开发者的。

(3)ConfigurableApplicationContext ApplicationContext的子接口,扩展出了close和refresh等关闭刷新容器的方法。

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

(5)FileSystemXmlApplicationContext 由文件系统中的XML配置文件读取上下文。

(6)XmlWebApplicationContext 由Web应用的XML文件读取上下文。

3、简述Spring中如何基于注解配置 Bean 和装配Bean

(1)首先要在Spring中配置开启注解扫描。

<context:component-scan base-package=”"></context:component-scan>

(2)在具体的类上加上具体的注解。

(3)Spring 中通常使用@Autowired 或者是@Resource等注解进行bean的装配。

4、说出Spring 或者Springmvc中常用的5个注解,并解释含义

@Component 基本注解,标识一个受Spring管理的组件。

@Controller 标识为一个表示层的组件。

@Service标识为一个业务层的组件。

@Repository 标识为一个持久层的组件。

@Autowired 自动装配。

@Qualifier(“”)具体指定要装配的组件的id值。

@RequestMapping)完成请求映射。

@PathVariable映射请求URL中占位符到请求处理方法的形参。

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

(1)默认情况下,IOC容器中bean的生命周期分为五个阶段: 1)调用构造器或者是通过工厂的方式创建Bean对象。

2)给bean对象的属性注入值。

3)调用初始化方法,进行初始化,初始化方法是通过init-method来指定的。

4)使用。

5)IOC容器关闭时,销毁Bean对象。

(2)当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段: 1)调用构造器或者是通过工厂的方式创建Bean对象。

2)给bean对象的属性注入值。

3)执行Bean 后置处理器中的postProcessBeforelnitialization。

4)调用初始化方法,进行初始化,初始化方法是通过init-method来指定的。

5)执行Bean的后置处理器中postProcessAfterInitialization。

6)使用。

7)IOC容器关闭时,销毁Bean对象。

6、简单的谈一下SpringMVC的工作流程?

(1)用户发送请求至前端控制器 DispatcherServlet。

(2)DispatcherServlet收到请求之后调用HandlerMapping处理器映射器。

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

(4)DispatcherServlet 调用HandlerAdapter 处理器适配器。

(5)HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

(6)Controller执行完成返回ModelAndView。

(7)HandlerAdapter将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。

(8)DispatcherServlet 将 ModelAndView 传给 ViewReslover视图解析器。

(9)ViewReslover解析后返回具体View。

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

(11)DispatcherServlet响应用户。

7、Mybatis 结果集的映射方式有几种,如何使用?

(1)自动映射 通过resultType来指定要映射的类型即可。

(2)自定义映射 通过resultMap来完成具体的映射规则,指定将结果集中的哪个列映射到对象的哪个属性。

8、MyBatis如何获取自动生成的(主)键值?

在标签中使用useGeneratedKeys和keyProperty两个属性来获取自动生成的主键值。 示例:

<insert  id="insertname”usegeneratedkeys="true”keyproperty="id">
Insert  into  names(name)values(#{name})
</insert>

9、简述Mybatis的动态SQL,列出常用的6个标签及作用

动态SOL是MyBatis的强大特性之一基于功能强大的OGNL表达式。 动态SQL主要是来解决查询条件不确定的情况,在程序运行期间,根据提交的条件动态的完成查询常用的标签:

<if>:进行条件的判断。

<where>:在<if> 判断后的SQL语句前面添加WHERE关键字,并处理SQL语句开始位置的AND或者OR的问题。

<trim>:可以在SQL语句前后进行添加指定字符或者去掉指定字符。

<set>:主要用于修改操作时出现的逗号问题。

<choose><when><otherwise>:类似于java中的switch 语句.在所有的条件中选择其一。

<foreach>:迭代操作。

10、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复。

11、简述Spring中如何给bean对象注入集合类型的属性

Spring 使用<list><set><map>等标签给对应类型的集合注入值。

12、简述Spring中bean的作用域

简介

(1)Singleton单例的 在SpringIOC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值。

(2)Prototype原型的 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XxxBean()。

(3)Request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境。

(4)Session 同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext环境。

(5)globalSession 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境。

详细说明

(1)当一个bean的作用域为Singleton, Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">

  (2)当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/> 

或者

<bean id="account" class="com.foo.DefaultAccount" singleton="false"/> 

  (3)当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="loginAction" class="cn".csdn.LoginAction" scope="request"/>

  针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

  (4)当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

  针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

  (5)当一个bean的作用域为Global Session,表示在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="user" class="com.foo.Preferences "scope="globalSession"/>

  global session作用域类似于标准的HTTP Session作用域,不过仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。   

13、请解释@Autowired 注解的工作机制及required属性的作用

(1)首先会使用bylype的方式进行自动装配,如果能唯一匹配,则装配成功。

如果匹配到多个兼容类型的bean,还会尝试使用byName的方式进行唯一确定。 如果能唯一确定,则装配成功,如果不能唯一确定,则装配失败,抛出异常。

(2)默认情况下,使用@Autowired标注的属性必须被装配,如果装配不了,也会抛出异常。可以使用required=false来设置不是必须要被装配。

14、简述Springmvc中ContextLoaderListener的作用以及实现原理作用

ContextLoaderListener的作用是通过监听的方式在WEB应用服务器启动时将Spring的容器对象进行初始化。 ContextLoaderListener 实现了ServletContextListener接口,用于监听ServletContext的创建,当监听到ServletContext创建时,在对应 contextInitialized方法中,将Spring的容器对象进行创建,并将创建好的容器对象设置到ServletContext域对象中,目的是让各个组件可以通过ServletContext 共享到Spring的容器对象。

15、简述Mybatis提供的两级缓存,以及缓存的查找顺序

(1)MyBatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,默认开启。

二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。

(2)缓存的查找顺序:二级缓存=>一级缓存>数据库。

16、简述Spring与Springmvc 整合时,如何解决bean被创建两次的问题

Bean被创建两次的问题解决需要在组建扫描的配置中指定Springmvc只负责扫描WEB相关的组件,Spring扫描除了Springmvc之外的组件。

17、简述Spring与Mybatis 整合时,主要整合的两个地方

(1)SqlSession创建的问题,通过SqlSessionFactoryBean 来配置用于创建SqlSession的信息。例如:Mybatis的核心配置文件、Mapper映射文件、数据源等。

(2)Mapper接口创建的问题,使用MapperScannerConfigurer 批量为MyBatis的Mapper接口生成代理实现类并将具体的对象交给Spring容器管理。

18、简述Spring 声明式事务中@Transaction中常用的两种事务传播行为

通过propagation来执行事务的传播行为REQUIRED:使用调用者的事务,如果调用者没有事务,则启动新的事务运行REQUIRES NEW:将调用者的事务挂起,开启新的事务运行。

19、简述@RequestMapping 注解的作用,可标注的位置,常用的属性

(1)该注解的作用是用来完成请求与请求处理方法的映射。

(2)该注解可以标注在类上或者是方法上。

(3)常用的属性:

value:默认属性,用于指定映射的请求URL。

method:指定映射的请求方式。

params:指定映射的请求参数。

headers:指定映射的请求头信息。

20、简述REST中的四种请求方式及对应的操作

GET 查询操作。

POST 添加操作。

DELETE 删除操作。

PUT 修改操作。