一.题目介绍
1.题目来源
实际面试中遇到,形式的话有书面解答也有口述。一般侧重点为Spring的bean的作⽤域,Spring中的bean⽣命周期,Spring MVC的请求流程,Spring中⽤到了哪些设计模式?
2.题目
1)Spring的bean的作⽤域
2)Spring中的bean⽣命周期
3)Spring MVC的请求流程
4)Spring中⽤到了哪些设计模式?
二.具体解答
1.Spring的bean的作⽤域
- singleton : 唯⼀ bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建⼀个新的 bean 实例。
- request : 每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP request内有 效。
- session : 每⼀次HTTP请求都会产⽣⼀个新的 bean,该bean仅在当前 HTTP session 内有 效。
- global-session: 全局session作⽤域,仅仅在基于portlet的web应⽤中才有意义,Spring5已经没有了。
- Portlet是能够⽣成语义代码(例如:HTML)⽚段的⼩型Java Web插件。它们基于 portlet容器,可以像servlet⼀样处理HTTP请求。但是,与 servlet 不同,每个portlet 都有不 同的会话
2.Spring中的bean⽣命周期
创建->使用->销毁
- Bean自身的方法:比如构造函数、getter/setter以及init-method和destory-method所指定的方法等
- Bean级生命周期方法:可以理解为Bean类直接实现接口的方法,比如BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean、DisposableBean等方法,这些方法只对当前Bean生效
- 容器级的方法(BeanPostProcessor一系列接口):主要是后处理器方法,比如上图的InstantiationAwareBeanPostProcessor、BeanPostProcessor接口方法。这些接口的实现类是独立于bean的,并且会注册到Spring容器中。在Spring容器创建任何Bean的时候,这些后处理器都会发生作用。
- 工厂后处理器方法(BeanFactoryProcessor一系列接口):包括AspectJWeavingEnabler、CustomAutowireConfigurer、ConfigurationClassPostProcessor等。这些都是Spring框架中已经实现好的BeanFactoryPostProcessor,用来实现某些特定的功能。
3.Spring MVC的请求流程
1)客户端(浏览器)发送请求,直接请求到DispatcherServlet 。
2)DispatcherServlet根据请求信息调⽤HandlerMapping,解析请求对应的Handler 。
3)解析到对应的Handler(也就是我们平常说的 Controller 控制器)后,开始由HandlerAdapte适配器处理。
4)HandlerAdapter会根据Handler来调⽤真正的处理器开处理请求,并处理相应的业务逻辑。
5)处理器处理完业务后,会返回⼀个ModelAndView对象, Model是返回的数据对象, View是个逻辑上的View。 6)ViewResolver 会根据逻辑View 查找实际的View 。
7)DispaterServlet 把返回的Model传给View(视图渲染)。
- 把 View 返回给请求者(浏览器渲染前端页面,数据显示)
4.Spring中⽤到了哪些设计模式?
⼯⼚设计模式 : Spring使⽤⼯⼚模式通过 BeanFactory 、 ApplicationContext 创建 bean 对 象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的Bean默认都是单例的。怎么保证单例Bean安全是个值得思考的问题。
包装器设计模式 : 我们的项⽬需要连接多个数据库,⽽且不同的客户在每次访问中根据需要 会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的⼀个应⽤。
适配器模式 :Spring AOP 的增强或通知(Advice)使⽤到了适配器模式、spring MVC 中也是⽤ 到了适配器模式适配 Controller
三.题后思考
Spring一直都是经典中的经典,所以是必须掌握的,而且里面有很多优秀的设计模式的巧妙使用,我们也可以借鉴,然后运用到实际的开发中去。