Spring总结
欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
Spring Framework
Spirng Framework 特有功能
轻量级 - Spring 在代码量和透明度方面都很轻便。
IOC - 依赖注入(setter和构造函数),控制反转。
IOC容器 - Spring 负责创建和管理对象(Bean)的生命周期和配置。
AOP - 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚。
MVC - 对 web 应用提供了高度可配置性,其他框架的集成也十分方便。
事务管理 - 提供了用于事务管理的通用抽象层。Spring 的事务支持也可用于容器较少的环境。
JDBC 异常 - Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。
Spring 常用组件
Core:只要提供Ioc依赖注入
Aspects:与Aspectj集成提供支持
AOP:面向切面编程的实现
JDBC:java数据库连接
JMS:java消息服务
ORM:持久化工具
web:为web应用提供支持
text:为单元测试提供支持
Spring Bean
Spring bean 支持 5 种 scope:
Singleton - 每个 Spring IoC 容器仅有一个单实例。
Prototype - 每次请求都会产生一个新的实例。
Request - 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效。
Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。
Global-session - 仅在基于 portlet 的 web 应用中才有意义。
Spring Bean 容器的生命周期
spring bean 容器的生命周期流程如下:
1. 实例化 - Spring 容器根据配置中的 bean 定义实例化 bean
2. 属性注入 - Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置
3. setBeanName() - 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()
4. setBeanFactory() - 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()
5. 依赖bean注入前 - 如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法
6. 自定义初始化调用 - 如果为 bean 指定了 init 方法(init-method),那么将调用它。
7. 依赖bean注入后 - 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法
8. 自定义销毁调用 - 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()
9. 自定义销毁调用 - 如果为 bean 指定了 destroy 方法(destroy-method),那么将调用它
Spring IOC 容器(底层是Map,解耦,即时与延迟加载)
将程序原本手动创建对象的控制权交给Spring容器管理。
Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。
原理:工厂模式加反射机制。
两种IOC容器:
BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。
ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。
Ioc初始化过程:
XML -读取> Resource -解析> BeanDefinition -注册> BeanFactory
AOP(面向切面编程)
将业务无关却共同调用的逻辑(日志管理,权限控制)封装起来,减少重复代码,降低耦合,提高可扩展性和可维护性。
Spring AOP 基于动态代理方式实现(反射机制):JDK代理(代理对象需要实现接口)
AspectJ 基于静态代理方式实现(字节码操作):CGLib代理(生成代理对象的子类)
Spring MVC(模型-视图-控制器)
1. 向服务器发送HTTP请求,请求被DispatcherServlet(前端控制器)捕获。
2. DispatcherServlet调用HandlerMapping(处理器映射器)获得该Handler配置的所有相关的对象(包括Handler以及Handler对应的拦截器),最后以HandlerExecutionChain(执行链)的形式返回。
3. DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。
4. HandlerAdapter去执行Hander。提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到`BindingResult`或`Error`中。
5. 返回ModelAndView。Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
6. 选择并返回 ViewResolver。根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
7. 渲染视图。ViewResolver 结合Model和View,来渲染视图。
8. 返回视图到客户端。视图负责将渲染结果返回给客户端。
Spring用到的设计模式
工厂模式:IOC(BeanFactory,ApplicationContext)
代理模式:AOP
单例模式:Spring Bean
模板方法模式:Template