spring、springboot、springmvc面试题
1.Spring框架是什么?
Spring是一个轻量级的Ioc和AOP容器框架,简化企业应用程序的开发,它使得开发只需要关心业务,常见的配置方式有三种:XML的配置、注解的配置、基于JAVA的配置
2.Autowired和Resource关键字的区别?
@Resource和@Autowired都是做bean的注入时使用,其实@Resource不是Spring的注解,它是一个包需要导入。
共同点:
两者都可以写在字段和setter方法上
不同点:
-
来源不同:@Autowired来自于Spring框架,而@Resource来自于JAVA的JSR-250规范
-
依赖查找的顺序不同:@Autowired先根据类型再根据名称查询,而且@Resource现根据名称再根据类 型查询
-
支持的参数不同:@Autowired只支设置一个参数,而且Resource支持设置多个参数
-
依赖注入的用法支持不同:Autowired既支持构造方法注入,又支持属性注入和setter注入,@Resource只支持属性注入和Setter注入。
3.Spring Bean 生命周期描述下
首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
Spring上下文中的Bean生命周期也类似,如下:
1)实例化Bean:
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注
入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容
器,当容器启动结束后,通过获取BeanDefifinition对象中的信息,实例化所有的bean。
2)设置对象属性(依赖注入):
实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefifinition中的信息 以
及 通过BeanWrapper提供的设置属性的接口完成依赖注入。
3)处理Aware接口:
接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String
beanId)方法,此处传递的就是Spring配置文件中Bean的id值;
②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传
递的是Spring工厂自身。
③如果这个Bean已经实现了ApplicationContextAware接口,会调用
setApplicationContext(ApplicationContext)方法,传入Spring上下文;
4)BeanPostProcessor:
如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会
调用postProcessBeforeInitialization(Object obj, String s)方法。
5)InitializingBean 与 init-method:
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
6)如果这个Bean实现了BeanPostProcessor接口,将会调用
postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调
用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
7)DisposableBean:
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现
的destroy()方法;
8)destroy-method:
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方
法。
4.依赖注入的方式有几种,各是什么?
-
构造器注入:将依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入
优点:对象初始化完成后可获得可使用的对象
缺点:注入的对象很多时,构造器参数列表将会很长;不够灵活.
-
setter方法注入:通过调用成员变量提供的setter函数将依赖对象注入给依赖类
优点:灵活,可以选择性注入需要的对象
缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
-
接口注入:依赖类必须要实现指定的接口,然后实现该接口的一个函数,该函数就是用于依赖注入。
缺点: 侵入性太强,不建议使用
5.谈谈对ioc的理解
ioc容器实际上是一个map,里面存放是各种对象,在项目启动的时候会读取配置文件里面的bean节点,根据限定类名使用反射创建对象放入map里面。
依赖注入是实现ioc的方法,就是在ioc容器运行期间,动态将某种依赖关系注入到对象的当中
控制反转指控制权不是由当前的对象来管理的,由其它类来管理=
6.谈谈对aop的理解
将程序中的交叉业务逻辑、封装成一个切面,然后注入到目标对象中,aop可以对某个对象的功能进行增强。
7.说说你对Spring MVC的理解
-
什么是MVC模式
MVC:MVC是一种设计模式
-
MVC的原理:用户发送一个请求到控制器(作用是调用业务类),然后交给模型层处理(Model)和视图渲染返回一个处理结果,然后返回结果给用户
-
M-Model模型(完成业务逻辑)
View视图(做界面的展示)
Controller控制器(接收请求——>调用模型——>根据结果派发页面)
8.SpringMVC的请求流程
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器
拦截器(如果有则生成)一并返回给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响应用户
9.SpringMVC常用的注解有哪些?
-
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中
的所有响应请求的方法都是以该地址作为父路径。
-
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
-
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
10.Spring框架中都用到了哪些设计模式?
-
简单工厂模式:Spring 中的 BeanFactory 就是简单工厂模式的体现。根据传入一个唯一的标识来获
-
得 Bean 对象,但是在传入参数后创建还是传入参数前创建,要根据具体情况来定。
-
工厂模式:Spring 中的 FactoryBean 就是典型的工厂方法模式,实现了 FactoryBean 接口的 bean
-
是一类叫做 factory 的 bean。其特点是,spring 在使用 getBean() 调用获得该 bean 时,会自动调
-
用该 bean 的 getObject() 方法,所以返回的不是 factory 这个 bean,而是这个 bean.getOjbect()
-
方法的返回值。
-
单例模式:在 spring 中用到的单例模式有: scope="singleton" ,注册式单例模式,bean 存放于
-
Map 中。bean name 当做 key,bean 当做 value。
-
原型模式:在 spring 中用到的原型模式有: scope="prototype" ,每次获取的是通过克隆生成的新
-
实例,对其进行修改时对原有实例对象不造成任何影响。
-
代理模式:Spring 中经典的 AOP,就是使用动态代理实现的,分 JDK 和 CGlib 动态代理。
11.解释Spring支持的几种bean的作用域?
Spring容器中的bean可以分为5个范围:
(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维
护。
(2)prototype:为每一个bean请求提供一个实例。
(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回
收。
(4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,
bean会随之失效。
(5)global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet
容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那
么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
12. Spring基于xml注入bean的几种方式?
(1)Set方法注入;
(2)构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
阿里内部资料
(3)静态工厂注入;
(4)实例工厂;
通常回答前面两种即可,因为后面两种很多人都不太会,不会的就不要说出来,不然问到你不会就
尴尬了