Spring框架面试题

1.你对Spring框架的理解(特点)? Spring框架有哪些模块 ?

  • Spring,一种用来简化企业应用级开发的开源整合框架。在项目中充当的是一个容器的作用,能够很好的整合第三方框架。比如:mybatis、struts2
  • spring拥有两大核心模块IOC和AOP。(也就是控制反转和面向切面编程)
  1. IOC:所谓的控制反转,也就是把创建对象的权力反转给spring容器进行创建和管理。
  2. AOP:不改变原有代码的基础上添加新的功能。比如:声明式事务,拦截器和过滤器

简化开发:它对常用的API做了封装,比如对JDBC的封装,使用Spring JDBC访问数据库,就不需要考虑如何获取连接和关闭的问题。
解耦:Spring帮我们管理软件之间的依赖关系,这样对象之间的耦合性就降低了,这样的维护性就得到了提高。
集成其它框架:方便扩展和优化其功能,例如和Mybatis的集成等。

2. Spring的优点 ?

简化开发,解耦,集成其它框架。
提高层与层之间的解耦性。

(↑)
低侵入式设计,代码污染级别极低。
Spring的DI机制降低了业务对象替换的复杂性,提高了软件之间的解耦。
Spring AOP支持将一些通用的任务进行集中式的管理,例如:安全,事务,日志等,从而使代码能更好的复用。
3. 什么是控制反转(IOC),什么是依赖注入(DI)?

问题:什么是控制反转(IOC),什么是依赖注入(DI)?

  • IOC:就是对象之间的依赖关系由容器来创建,对象之间的关系本来是由我们开发者自己创建和维护的,在我们使用Spring框架后,对象之间的关系由容器来创建和维护,将开发者做的事让容器做,这就是控制反转。BeanFactory接口是Spring Ioc容器的核心接口。
  • DI:我们在使用Spring容器的时候,容器通过调用set方法或者是构造器来建立对象之间的依赖关系。
    控制反转是目标,依赖注入是我们实现控制反转的一种手段。

4. Java中实现依赖注入的三种方式?

  • set方法注入
  • 构造器注入
  • 注解的自动转配 @Autowired

5.Spring容器中如何创建对象?

  • 无参构造创建
  • 静态工厂创建
  • 实例工厂创建

6. Spring有几种配置方式 ?(了解)
基于XML文件的配置 这种配置文件的格式常用开头,然后运用一系列的bean定义和专门的应用配置选项组成。 Spring XML配置方式是使用被Spring命名空间所支持的一些列XML的标签来实现的。
基于注解的配置 可以使用注解的方式来代替XML方式的bean元素的配置。这就是组件扫描,常用依赖注入的一些注解有: @Controller @Service @Autowired @RequestMapping @RequestParam @Resource @Required @Qualifier
组件扫描: 容器会扫描base-package指定的包及其子包下面的所有类,如果该类有一些特定的注解,则纳入容器进行管理。
在类前面添加的一些特定的注解: @Component 通用注解 @Repository 持久层注解 @Service 业务层注解、 @Controller 控制层注解
7. Spring Bean的生命周期 ?(了解)
指Spring中bean元素被实例化,和被销毁的过程。我们通过init-method属性指定初始化方法; 通过destroy-method方法指定销毁方法。
注意:只有作用域为Singleton的时候才会有效。
8. 解释什么叫bean的延迟加载 ?
默认情况下,容器启动之后会将所有作用域为单例的bean创建好;但是有的业务场景我们并不需要它提前都创建好;
此时,我们可以在bean中设置lzay-init=“true”,这样,当容器启动之后,作用域为单例的bean,就不在创建。
9. 解释什么是自动装配 ?(第一个比较好)

  • 自动装配就是根据属性的类型给属性装配对象
  • 自动装配就是把ioc容器中已经有的对象,通过@Autowired注解对需要对象进行自动装配。

就是将一个Bean注入到其它的Bean的Property中,默认情况下,容器不会自动装配,需要我们手动设定。Spring 可以通过向Bean Factory中注入的方式来搞定bean之间的依赖关系,达到自动装配的目的。
10. Spring bean元素的作用域?
当通过Spring容器创建一个Bean实例的时候,不仅可以完成bean实例的实力化,还可以为bean指定作用域。Spring bean元素的常用作用域:

  • Singleton:单例模式,在整个spring IOC容器中,使用singleton定义的bean将只有一个实例。

  • Prototype:多例模式,每次通过容器中的getBean方法获取prototype定义的beans时,都会产生一个新的bean的实例。

  • Request:对于每次Http请求,使用request定义的bean都会产生一个新的实例,只有在web应用时候,该作用域才会有效。

  • Session:对于每次Http Session,使用session定义的Bean都将产生一个新的实例。
    11. Spring中的bean是线程安全的么?
    Spring框架并没有对单例的bean进行多线程的封装处理,线程安全问题和并发问题,需要我们开发者自己考虑。
    12. 如何在Spring中注入一个Java Collection ?
    Spring提供理论四种集合类的配置元素:
    http://www.cnblogs.com/shamo89/p/9916475.html

  • List: 该标签用来装配 有重复值的list值

  • set: 该标签用来装配没有重复值的 set值

  • map:该标签科以用来注入键值对

  • properties: 该标签用来支持注入键值对和字符串类型键值对。

13. Spring框架中都用到了哪些设计模式 ?

  • 代理模式,在AOP中被使用最多。
  • 单例模式,在Spring配置文件中定义bean的时候默认的是单例模式。
  • 工厂模式,BeanFactory用来创建对象的实例。

14.Spring AOP(面向切面)编程的原理 ?

AOP面向切面编程,它是一种思想。简单点说就是在不改变原有代码的基础上额外添加新功能的操作,比如spring对事物的统一管理,拦截器。可以采用声明式事物配置方式来实现AOP切面编程。
16. 解释一下代理模式(Proxy)

  • 代理模式: 代理模式就是本该我做的事,我不做,我交给代理人去完成。就比如,我生产了一些产品,我自己不卖,我委托代理商帮我卖,让代理商和顾客打交道,我自己负责主要产品的生产就可以了。 代理模式的使用,需要有本类,和代理类,本类和代理类共同实现统一的接口。然后在main中调用就可以了。本类中的业务逻辑一般是不会变动的,在我们需要的时候可以不断的添加代理对象,或者修改代理类来实现业务的变更。
    代理模式可以分为: 静态代理 优点:可以做到在不修改目标对象功能的前提下,对目标功能扩展 缺点:因为本来和代理类要实现统一的接口,所以会产生很多的代理类,类太多,一旦接口增加方法,目标对象和代理对象都要维护。 动态代理(JDK代理/接口代理) 代理对象,不需要实现接口,代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象,需要我们指定代理对象/目标对象实现的接口的类型。 Cglib代理 特点: 在内存中构建一个子类对象,从而实现对目标对象功能的扩展。
    17. 什么是Spring MVC ?
    ·springmvc是基于模型视图控制器的一种设计模式
    Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一部分,它和Struts2一样都属于表现层的框架。

MVC(Model模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器。 模型:用于封装业务逻辑处理(java类); 视图:用于数据展现和操作界面(Servlet); 控制器:用于协调视图和模型(jsp); 处理流程:视图将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现处理结果;

Spring MVC的五大组键 ?

  1. 前端控制器 //什么都不干,只是转发。
  2. 处理器映射器 //处理前端发送的url
  3. 处理器适配器 //找真正干活的处理器
  4. 处理器 //处理业务
  5. 视图解析器 //解析视图

19. Spring MVC 的运行原理

  • 客户端发送一个请求提交给前端控制器
  • 前端控制器根据提交的url找到处理器映射器
  • 处理器映射器去找处理器适配器执行相应的controller。
  • 根据controller返回来的结果去点用视图解析器
  • 视图解析器实现页面的渲染和展现

20. SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
默认是单例模式
在多线程访问的时候有线程安全问题
不能使用用同步,会影响性能的
解决方案是在控制器里面不能写成员变量。

21.SpringMVC怎样设定重定向和转发 ?

  • 在返回值的前面加”forword”,就可以实现让结果转发;
  • 在返回值的前面加上”redirect”,就可以让返回值重定向。

转发和重定向的区别:

  • 转发的request域能得到,重定向得不到
  • 转发在服务器端完成的;重定向是在客户端完成的
  • 转发的速度快;重定向速度慢
  • 转发的是同一次请求;重定向是两次不同请求
  • 转发不会执行转发后的代码;重定向会执行重定向之后的代码
  • 转发地址栏没有变化;重定向地址栏有变化
  • 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

22. Spring MVC的优点:
简单好用,便于开发,便于扩展,便于维护。

一:完全基于接口编程,真正实现了视图无关。
二:Spring MVC框架以DispatchServlet为核心控制器,该控制器负责拦截用户的所有请求
三:具有强大的灵活性、非侵入性和可配置型。
四:分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器,等等,每一个功能实现由一个专门的对象负责完成。
五:实现更加灵活的模型数据传输。

单点登录描述:
由于我们这项目是soa架构的,所以传统的登录方式把登录信息放在session里的方法就不再适用了,所以呢我们使用的单点登录解决的这个登录问题。我们单独架构了一个redis单点登录服务器,用户发送请求到单点登录服务器,先去数据库校验用户信息是否正确,如果不正确就直接返回登录失败,如果正确则生成一个token,这个token其实就是一个uuid,我们把这个uuid作为key,把用户信息作为value存放在redis里,并且设置它的过期时间,然后返回登录成功了,并且把token放在cookie里,然后每次请求都携带这个cookie去访问单点登录服务器,第二次访问的时候先取出cookie中的token,判断redis里是否存在这个token,如果没有则返回没有登录,如果登录成功则返回已经登录,并且重置过期时间。

你可能感兴趣的:(JavaWeb)