框架概述
什么是框架
框架实际上就是别的程序员开发的项目的半成品
通常情况下,框架是用来实现具体业务功能的模板
学习框架首先要掌握框架的使用方法,暂时先不研究底层实现
为什么使用框架
因为框架能够简化现有的代码编写
初级的程序员也能在框架的帮助下,编写出良好的程序
我们要学习哪些框架
1.Spring:本阶段,以及项目中大部分框架的基础支持
2.Mybatis:代替jdbc,简化jdbc的连接数据库代码
3.SpringMvc:代替Servlet,简化Servlet中的代码
4.SpringBoot: SSM的整合,整合后,配置更少,使用更方便
5.SpringCloud:微服务的实现,更适合开发大型的互联网项目
6.辅助组件和中间件:Redis,ES,Kafka
下面我们就开始学习第一个框架Spring
Spring框架
第三方编写的一套能够实现Ioc(DI)和Aop功能的框架
Spring被称之为java的”救世主”
Spring的出现改变了java既有的编程方式
Spring的主要功能
Spring主要功能有两个
分别是
1.Ioc(DI) —- 控制反转(依赖注入)
2.AOP —- 面向切面编程(后面的课程讲解)
控制反转
控制反转(Ioc:Inversion of Control)
要想了解控制反转,就要知道我们之前编写的程序都是”主动控制”
主动控制:是由程序员来主动管理和控制程序中需要使用的对象
控制反转:是将控制和管理程序中所使用到对象的权利交给外部容器
javaBean代码规范
Bean:豆子
javaBean其实就是java语言中,承载数据用的类,
现在我们理解javaBean就理解为数据表对应的实体类就可以了
凡是javaBean就要遵循一些代码的规范
- 必须在包下创建javaBean
- 必须包含无参构造
- 必须实现序列化接口
- 属性都是私有的,包含公有的get\set方法
遵循行业规范是每个程序员的基本素养,请牢记并遵守
利用JUnit进行测试
什么是JUnit
JUnit就是java单元测试,能够针对java程序中的某段代码或指定的方法进行测试
为什么需要JUnit
如果没有JUnit,我们使用项目中创建一个类,这个类中编写main方法的方式来进行测试,这样的方式一个类只能有一个main方法
测试不方便,而且测试用的main方法的类和其它类都写在同一个区域中,造成类的数量比较多,不好管理
Junit可以在我们编写正常java类的区域之外,再创建专门的测试区域
而且一个类可以测试多个方法,更专业更简单
JUnit中的@Before和@After
如果经常使用JUnit测试Spring
那么就需要经常创建和销毁Acac对象,这样就会产生代码的冗余
为了解决这样的冗余,使我们的测试更加简单
我们可以使用@Before和@After来简化测试流程
Spring组件扫描
我们现在学习了怎么在Config类中使用@Bean来注入对象到Spring容器
但是Spring提供了很多中注入方法方便我们在不同情况下使用注入功能
什么时候使用组件扫描
当一个类不需要进行任何属性或状态的设置,单纯的直接实例化就注入到Spring容器时,就不需要使用@Bean的注入方式了,推荐使用组件扫描
使用组件扫描注入对象
步骤1:
在要注入的类名上(前一行)添加如下注解
@Component 这个单词是组件的意思
步骤2:
在配置Spring的Config类中添加扫描组件的注解
注意这个注解要指定一个包,这个包中所有类如果有标名@Component注解的类就会自动注入到Spring容器中
一般情况下,组件扫描方式注入的对象的id就是类名
但是对类名可能有细微的修改
- 当类名首字母是大写,第二个字母是小写时,id为首字母小写的样式 例:DragonBlade -> dragonBlade
- 当类名前两个字母连续大写时,id就是类名不变 例:AOPTest -> AOPTest
需要注意,实例开发中,很少有需要自定义id的需求和必要,一般情况下使用类名即可!!!
Spring容器中对象的管理
Spring容器中对象的作用域
Spring容器中对象可能会有不同的作用域
在不同的程序需求下,设置为不同的管理模式
根据程序中对象的出现形式,我们可以将程序中的对象分为两种
1.程序中只出现唯一一个的:单例(singleton)
2.程序中出现很多的:原型(prototype)
Spring容器中注入的对象,在程序中运行也要分出这两种对象
实际开发中,大部分的对象都是单例的,提高的内存的利用率,所以Spring在默认情况下,也将注入到Spring容器的对象设置为单例
Spring容器中对象的创建和销毁
如果想研究Spring容器对对象实例化和销毁的时机
我们先要掌握如何在对象实例化和销毁时运行指定的方法来通知我们
我们会发现单例的作用域下
- 在实例化acac对象即Spring容器时,User对象就已经实例化并注入到Spring容器中了
- 无论在测试代码中获得多少次User对象,都不会再次实例化
- 并且在acac对象销毁前,User对象也会自动销毁!
如果上述代码在原型的作用域下
我们会发现原型的作用域下
- User对象不会随acac即Spring容器的实例化而实例化
- 每当测试代码中获得User对象时,都会实例化一个新的User对象反复获得时就会反复实例化
- acac对象销毁时,原型状态下的User对象没有销毁
我们今后使用的比较多的是单例的
单例模式还有一个小缺点,需要额外的弥补一下
懒惰初始化
通过上面章节的测试,我们发现单例模式的对象会在Spring容器实例化的同时也实例化,这样情况下,就会造成Spring容器中单例对象较多时,实例化时间较长
如果很多单例的对象在程序实际运行中根本就用不到,这样这些实例化操作和内存就白白浪费了
这种情况下,我们就可以使用懒惰初始化
一个对象的注入一旦被标记为懒惰初始化,那么在acac实例化时,就不会同时实例化它了,而会在获得这个类型对象时,再实例化
Spring的DI
DI概述
什么是DI
DI中文翻译就是依赖注入(dependency injection)
是Spring框架中实现Ioc的一种操作
什么是依赖
所谓依赖,就是一个对象在运行某个业务或方法时需要的原材料
我们称这个对象依赖这个原材料来实现这个业务
人依赖笔完成写字方法
关羽依赖青龙偃月刀完成战斗方法
什么是注入
将一个外部的对象,保存到指定对象的内部
比如将User对象注入到Spring容器中
通过上面对依赖和注入的分别解释,
依赖注入可以总结为:
使用注入的方式,将一个对象依赖的原材料直接保存到这个对象的属性中
使用依赖注入的情况
使用@Bean注入
编写低耦合的依赖注入
什么是高耦合(紧耦合)
所谓的高耦合,就是依赖对象和被依赖的对象的关系是紧密的,不可替换的
关羽类中声明依赖青龙偃月刀类型,就是依赖对象和被依赖对象关系是紧密的
因为关羽除了青龙偃月刀不能使用其他任何兵器完成战斗业务
我们编写程序,高耦合被认为是不好的,因为它不能应对程序的变化,不方便扩展和维护
我们要对现有的代码进行”解耦”
所谓解耦就是将现在高耦合的依赖状态变化为低耦合(松耦合)的
做法非常简单,就是提取当前被依赖类的抽象类或者接口
让依赖本类的类中声明为这个抽象类或接口即可
实现解耦
先使用@Bean的方式来实现
SpringMVC
SpringBoot来实现SpringMvc框架搭建
什么是SpringBoot
Boot是开机\启动的意思
SpringBoot就是在Spring系列框架下开机的引导器
如果没有SpringBoot我们就要手动配置大量的内容,使用了SpringBoot这些复杂又固定的配置就在SpringBoot内部配置完毕了,我们只需要直接使用即可
由于SpringBoot内部做了很多配置,我们需要知道这些配置最终的使用方式,这样的情况称为”约定大于配置”,SpringBoot已经约定好了配置的结果,我们在这样的配置下直接使用即可
SpringMVC概述
什么是SpringMvc
SpringMVC是一个Spring框架支持下衍生出来的框架
用途是简化控制层的操作,这里的控制层指的就是Servlet
其中MVC分别代表
M:Model(数据模型) V:View(视图) C:Controller(控制器)
SpringMVC框架主要解决的是V和C的交互问题
当前有很多解决V和C交互问题的框架,除SpringMvc之外还有Struts2,JFinal等
SpringMvc核心执行流程图
DispatcherServlet:前端控制器,用于接收所有请求
HandlerMapping:用于配置请求路径与Controller组件对应关系的
Controller:控制器,由使用框架的程序员编写的处理请求的组件
ModelAndView:Controller处理请求后的结果,由数据和视图名称组成
ViewResolver:视图解析器,根据视图名称,确定要返回的视图