Spring是什么
- Spring是一种简化应用程序开发的轻量级开源框架,主要由几部分组成
- Spring Core
- Spring Bean 提供Spring框架基本功能,核心组件是BeanFactory
- Spring Context 提供其一个全局的上下文环境
- JDBC JDBC封装模块
- Spring ORM 提供了Hibernate和JPA的集成
- Spring Transaction 事务管理模块
- Spring Web MVC
- Spring AOP 集成面向切面功能,提供事务管理服务
- 简化开发:对常用API做了封装,比如JDBC的封装,使用Spring,访问数据库就不用考虑如何连接和关闭
- 解耦:Spring帮我们管理软件之间的依赖关系,降低对象间的耦合性,让系统维护变的方便
- 框架的框架:集成框架,方便优化扩展,比如Mybatis的集成
- Spring框架按照设计模式打造,不用考虑后台的进行
Spring的优点
- Spring的依赖注入降低对象替换的复杂度,提高软件的解耦
- Spring支持切面编程,把业务逻辑和系统服务分开,将通用任务集中管理
- 集成主流框架,高兼容度
- 测试方便,测试相关代码已经封装在框架中
IoC
Srping IoC容器,创建管理Bean对象
- 使用依赖注入管理Bean对象
- 读取配置元数据 Bean Definition 实例化一个对象,相当于Java中的Class,抽象作用域,注入模型,和是否懒加载等信息
- XML配置,注解配置和Java Config 提供配置元数据
IoC初始化过程
- 加载配置文件,解析BeanDefinition到Map里
- 从Map里拿出Class对象实例化,有依赖关系就调用getBean完成依赖注入
IoC DI
- 控制翻转:对象之间依赖关系由容器创建容器维护,BeanFactory是核心接口
- 依赖注入:使用Spring的时候通过调用set方法或者构造器建立对象间的依赖关系
实现依赖注入的三种方式
- 构造器注入 不用设置setter方法
- set方法注入 一定要写空参数的构造方法
- 接口注入
Spring容器如何创建对象
- 无参构造创建
- 静态工场创建
- 实例工场创建
Spring有几种配置方式
- XML文件
- 注解配置
- 组件扫描,Java Config配置,@Bean 和 @Configuration
Spring Bean的生命周期
- 实例化 Instantiation 根据配置实例化Bean对象
- 属性赋值 Populate 通过依赖注入填充这个Bean属性和配置,Name方法和Factory方法
- 初始化 Initialization 调用相应方法进一步初始化Bean对象,
- 销毁 Destruction 调用destroy方法或者bean-method指定的方法销毁
延迟加载
懒加载,默认容器启动时所有单例模式的bean都创建成功,设置lazy-init="true"可以延迟创建
Spring bean的作用域
- 单例,Singleton,默认作用域,整个spring容器只有一个实例
- 原型,Prototype,每次创建一个新对象
- 请求,Request,每次HTTP请求创建一个新对象
- 会话,Session,同一个会话共享一个实例,不同会话使用不用的实例
- 全局会话,Global-session,所有会话共享一个实例
bean线程安全
bean默认单例模式,框架没有对bean进行多线程封装处理,不是线程安全
但是,对于原型bean,每次调用都创建一个新对象,线程之间不共享,没有线程安全问题
对于单例bean,所有线程共享一个实例,存在资源竞争
但是,有无状态的bean,线程不对bean进行查询以外的操作,只查询,不增删改查,则bean是线程安全的,比如Spring MVC的Controller,Service,DAO都是无状态的,只关注方法本身
Spring的设计模式
- 代理模式:通过AOP实现动态代理,有接口用JDK proxy实现代理对象,没接口用CGlib生成子类代理
- 单例模式:Spring默认模式
- 工场模式:通过BeanFactory或者ApplicationContext创建bean对象,一个延迟注入启动更快,一个一次性创建所有bean
- 模板方法模式:定义了一个算法的骨架,像是JdbcTemplate,RestTemplate等以Template结尾的类使用了模板模式
- 观察者模式:对象与对象间的依赖关系,当一个对象改变的时候,这个对象所依赖的对象也会做出反应,比如利用监听器解耦商品索引和操作商品的依赖
- 适配器模式:将一个接口转换成另一个接口,让不兼容的类也可以一起工作,也叫包装器。Spring AOP的增强和通知(Advice)用到了适配器模式,Spring MVC使用了适配器模式适配Controller
AOP原理
传统面向对象的开发过程逻辑是自上而下的,会产生一些横切性的问题,通过AOP把业务逻辑和横切问题分离,从而达到解耦的目的,使代码重用性提高,更容易维护
AOP的应用场景:日志记录,权限控制,事务管理,懒加载,持久化
AOP底层原理:JDK动态代理,CGLIB代理
Spring MVC
Spring MVC是一种web层的mvc框架,它是Spring的一个模块,拥有Spring的特性。Spring MVC分离了模型-视图-控制器的角色,结构清晰,各层代码各司其职,易于开发大型项目
Spring MVC的五大组件
- 前端控制器(DispatchServlet)
- 映射处理器(HandlerMapping)
- 处理器(Controller)
- 模型视图(ModelAndView)
- 视图解析器(ViewResolver)
Spring MVC的运行原理
- 客户端提交请求到前端控制器DispatchServlet,前端控制器找到对应的映射处理器HandlerMapping,映射处理器找到Controller处理请求,Controller处理完请求返回模型视图给ModelAndView,DispatchServlet查询视图解析器,找到视图模型里的指定视图,将结果显示到客户
Spring控制器
单例模式,有线程安全问题,避免在控制器里写字段
重定向和转发
转发Forward
- 地址栏不变
- 只能访问当前服务器
- 一次请求,直接调用跳转页面返回,浏览器不知道有没有forward,
可以共享request数据
重定向Redirect - 地址栏改变
- 访问其他站点
- 两次请求,浏览器自己去请求跳转的网页,不能共享request数据
Spring和Struts2区别
- Spring MVC基于方法开发,传递参数是通过方法形参,默认是单例
- Struts2基于类开发,传递参数通过类的属性,只能是多例
REFTFUL
一种设计思想,简化get请求的结果,通过请求类型控制业务的执行
- 简化get请求类型,减少地址链接传递的字节信息
- 可以通过一个URL地址通过不同请求类型
Spring Boot
- 独立运行,内嵌Servlet,Tomcat容器,所有依赖都在一个jar包里
- 简化配置,spring-boot-starter-web启动器自动依赖其他组件,减少配置
- 自动配置,一个jar包解决所有,不用XML配置文件
跨域
- JSONP方式,只支持get请求
- RESTful风格
- CROS ORIGIN实现跨域资源共享
Nginx
Nginx是一个代理服务器,并发能力很强,可以实现负载均衡和反向代理
反向代理
- 代理服务器,用户和服务器间的桥梁
- 对于用户来说就是目标服务器
- 用户不知道服务器真实地址
- 反向代理保护里服务器的信息