Spring面试题
1、什么是 Spring 框架?
Spring是一种轻量级框架,主要核心功能是ioc和aop,core组件是spring所有组件的核心,Beans和context是实现ioc的基础,aop是用来实现面向切面编程的。
2、@RestController vs @Controller
@RestController在@Controller的基础上加上了@ResponseBody这个 注解,使得返回的对象都变成json格式。通常用在前后端分离的项目中。
3、谈谈自己对于 Spring IoC 和 AOP 的理解
IOC
IOC是控制反转的意思,意思是把我们手动new出来的对象的控制权交给Spring管理,IOC容器本质是一个map,里面存放了Bean对象,将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
AOP
AOP的意思是面向切面编程,将我们与业务无关的代码封装起来,简化我们的业务代码,增强我们的功能,比如事务、日志、权限管理等等都可以使用aop实现。aop的核心是动态代理,spring的动态代理有两种实现方式,分别是jdk和cglib,spring中如果代理的对象有接口,就会使用jdk动态代理,如果没有会使用cglib继承该类来代理。cglib在创建的时候比较慢,但是在运行的时候会比jdk要快。
4、Spring Aop和AspectJ Aop的区别
Spring Aop是运行时增强,基于动态代理实现,AspectJ Aop是编译期增强,是基于字节码修改增强。AspectJ Aop会更快。
5、Bean的生命周期
- Bean 容器找到配置文件中 Spring Bean 的定义。
- Bean 容器利用 Java Reflection API 创建一个Bean的实例。
- 如果涉及到一些属性值 利用 set()方法设置一些属性值。
- 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字。
- 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
- 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
- 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
- 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
- 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
- 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
- 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
- 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。
6、Spring MVC执行流程
- 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
- DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
- 解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。
- HandlerAdapter 会根据 Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
- 处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)
7、BeanFactory和ApplicationContext的区别
BeanFactory是spring最底层的接口,提供了基本的容器功能,比如创建和获取,ApplicationContext是继承BeanFactroy并且多了很多功能,比如国际化之类的功能,BeanFactory中的Bean在Spring容器启动的时候不会实例化Bean,只会在用到的时候才实例化,ApplicationConetxt中的Bean在Spring启动的时候就会实例化Bean,但可以设置懒加载。