应用场景面试题集(各知识点不同使用场景选型)
1. Spring 配置 Bean 实例化有哪些方式?
- 使用类构造器实例化(默认无参数)
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
- 使用静态工厂方法实例化(简单工厂模式)
//下面这段配置的含义:调用 Bean2Factory 的 getBean2 方法得到 bean2
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory"
factorymethod="getBean2"></bean>
- 使用实例工厂方法实例化(工厂方法模式)
//先创建工厂实例 bean3Facory,再通过工厂实例创建目标 bean 实例
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"/><bean
id="bean3" factorybean="bean3Factory" factorymethod="getBean3"></bean>
2. Bean 注入属性有哪几种方式
- 属性注入方式,通过 setXXX() 方法注入 Bean 的属性值或者依赖对象
- 构造函数注入方式,使用的前提:Bean 必须提供带参的构造函数
- 工厂方法注入方式
3. 在 Spring 中如何实现时间处理?
在 applicationContext.xml 中配置事件源、监听器,先得到事件源,调用事件 源的方法,通知监听器。
4. Spring 中如何更高效的使用 JDBC ?
传统的 JDBC 实现有两个不足之处:
- 连接需要自己管理操
- JDBC 操作代码封装与编写重复实现
Spring 实现了 JdbcTemplate,在 JDBC API 的基础做了科学的封装。
JdbcTemplate 的优点有:
- 配置基于模板化处理
- JdbcTemplate 是线程安全类
- 实例化操作比较简单,仅需要传递 DataSource
- 自动完成资源的创建和释放工作
- 对 JDBC 的核心流程进行了封装,简化了对 JDBC 的操作
- 创建一次 JdbcTemplate,到处可用,避免重复开发
5. 请介绍一下设计模式在 Spring 框架中的使用?
- 工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实 例。
- 单例模式:Bean 默认为单例模式。
- 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字 节码生成技术。
- 模板方法:用来解决代码重复的问题。比如:RestTemplate, JmsTemplate, JpaTemplate。
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生
改变时,所有依赖于它的对象都会得到通知被制动更新,如 Spring 中
listener 的实现:ApplicationListener。
6. 讲讲 Spring 框架的优点有哪些?
- 非侵入式设计:代码与框架的依赖性比较低。
- 代码解耦:提供控制反转能力,对象的创建和依赖关系的维护工作都交给
Spring 容器的管理,大大的降低了对象之间的耦合性。 - 可复用性提高:支 AOP ,允许将一些通用能力(打印日志、事务处理、 安全操作等)
进行集中式处理。 - MVC 框架:Spring 的 Web 框架是个精心设计的框架,是 Web 框架 的一个很好的替代品。
- 事务支持方便:Spring 提供一个持续的事务管理接口,配置化完成对事 物的管理,减少手动编程。
- 异常处理:Spring 提供方便的 API 把具体技术相关的异常(比如由 JDBC、Hibernate or JDO 抛出的)
转化为一致的 unchecked 异常。 - 方便程序测试:提供了对 Junit4 的支持,可以通过注解方便的测试 Spring 程序。
7. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注 入?
你两种依赖方式都可以使用,构造器注入和 setter 方法注入。最好的解决方案 是用构造器参数实现强制依赖,setter 方法实现可选依赖。
8. 你怎样定义类的作用域?
当定义一个 <bean> 在 Spring 里,我们还能给这个 Bean 声明一个作用域。
它可以通过 Bean 定义中的 scope 属性来定义。如,当 Spring 要在需要的
时候每次生产一个新的Bean实例 , Bean的scope属性被指定为prototype。
另一方面,一个 Bean 每次使用的时候必须返回同一个实例,这
个 Bean 的 scope 属性必须设为 singleton。
9. 解释 Spring 支持的几种 Bean 的作用域
Spring 框架支持以下五种 Bean 的作用域:
- singleton:Bean 在每个 Spring IoC 容器中只有一个实例。
- prototype:一个 Bean 的定义可以有多个实例。
- request:每次 http 请求都会创建一个 Bean,该作用域仅在基于 Web 的 Spring ApplicationContext
情形下有效。 - session:在一个 HTTP Session 中,一个 Bean 定义对应一个实例。 该作用域仅在基于 Web 的 Spring ApplicationContext 情形下有效。
- global-session:在一个全局的 HTTP Session 中,一个 Bean 定义对 应一个实例。该作用域仅在基于 Web 的 Spring ApplicationContext 情形下有效。
缺省的 Spring Bean 的作用域是 Singleton。
10. 在 Spring 中如何注入一个 Java 集合?
Spring 提供以下几种集合的配置元素:
- <list> 类型用于注入一列值,允许有相同的值。
- <set> 类型用于注入一组值,不允许有相同的值。
- <map> 类型用于注入一组键值对,键和值都可以为任意类型。
- <props> 类型用于注入一组键值对,键和值都只能为 String 类型。
11. 你可以在 Spring 中注入一个 null 和一个空字符串吗?
可以
12. 什么是基于 Java 的 Spring 注解配置?
给一些注解的例子 基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分
Spring 配置而非通过 XML 文件。
以 @Configuration 注解为例,它用来标记类可以当做一个 Bean 的定义,被
Spring IOC 容器使用。另一个例子是 @Bean 注解,它表示此方法将要返回一
个对象,作为一个 Bean 注册进 Spring 应用上下文。
13. 你更倾向用那种事务管理类型?
声明式事务管理,因为它对应用代码侵入性很少,更符合一个无侵入的轻量级容 器的思想。
声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许
你通过代码控制事务)少了一点灵活性。
14. Bean 的调用方式有哪些?
有三种方式可以得到 Bean 并进行调用。
- 使用 BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
- 使用 BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
- 使用 ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
使用 @ResponseBody 注解。
15. Spring MVC 里面拦截器是怎么写的
有两种写法,一种是实现接口,另外一种是继承适配器类,然后在 Spring MVC
的配置文件中配置拦截器即可:
<!-- 配置 SpringMvc 的拦截器 --> <mvc:interceptors>
<!-- 配置一个拦截器的 Bean 就可以了 默认是对所有请求都拦截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"/>
<!-- 只针对部分请求拦截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.et.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor> </mvc:interceptors>
16. 当一个方法向 AJAX 返回特殊对象,譬如 Object、List 等,需要 做什么处理?
要加上 @ResponseBody 注解。
17. 如何使用 Spring MVC 完成 JSON 操作
- 配置 MappingJacksonHttpMessageConverter
- 使用 @RequestBody 注解或 ResponseEntity 作为返回值
18. Spring 如何整合 Hibernate
整合 Hibernate,即由 IoC 容器生成 SessionFactory 对象, 并使用 Spring
的声明式事务。
- 利用 LocalSessionFactoryBean 工厂 Bean,声明一个使用 XML 映射
文件的 SessionFactory 实例 - 利用 HibernateTransactionManager 配置 Hibernate 的事务管理器
19. Spring 如何整合 Struts2 ?
整合 Struts2,即由 IoC 容器管理 Struts2 的 Action:
- 安装 Spring 插件:把 struts2-spring-plugin-2.2.1.jar 复制到当前
Web 应用的 WEB-INF/lib 目录下 - 在 Spring 的配置文件中配置 Struts2 的 Action 实例
- 在 Struts 配置文件中配置 action,但其 class 属性不再指向该 Action
的实现类,而是指向 Spring 容器中 Action 实例的 ID
20. 开发中主要使用 Spring 的什么技术 ?
- IoC 容器管理各层的组件
- 使用 AOP 配置声明式事务
- 整合其他框架
21. 介绍一下 Spring MVC 常用的一些注解
- @RequestMapping:处理请求地址映射的注解,可用于类或方法上。
- @PathVariable:绑定 URI 模板变量值是用来获得请求 url 中的动态参
数 - @RequestParam:用于将指定的请求参数赋值给方法中的形参
- @RequestBody:读取 Request 请求的 body 部分数据
- @ResponseBody:用于将 Controller 的方法返回的对象,通过适当的 HttpMessageConverter
转换为指定格式后,写入到 Response 对象 的 body 数据区
22. Spring 框架的事务管理有哪些优点
- 为不同的事务 API( JDBC、Hibernate、JPA )提供统一的编程模型
- 封装了简单统一的 API 对事物进行管理操作
- 同时支持声明式事物和编程时事物两种方式