6.23 第四阶段 Spring(第一天)

第四阶段:框架、项目、微服务

Spring:2天

项目阶段:10天

微服务阶段:8~9天

Spring框架(核心:IOC 和 AOP)

Spring MVC 和 Spring Boot的区别:

(1)Spring MVC:主要实现 视图 和 控制器 的交互 (Model View Controller)

什么是Spring MVC框架的内容?
Spring MVC干的是这个:前台页面与Java后台的交互(视图与控制器Controller的交互)
				     页面的信息怎么发给Java,Java的信息怎么响应给页面
							 
Controller注解标记的这些类:来接收页面表单axios、异步那些,发送过来请求的  -----这是控制器
页面: 就是html 和 vue那些前端内容    -----这是视图
			
	Spring MVC就是实现 视图 和 控制器 的信息交互 

(2)Spring Boot:boot(意思是: 启动),是spring提供的一种快速的启动方式
                 这个方式中包括了很多默认的配置;(方便我们启动Spring项目)
  例如:页面都在static文件夹下,包括配置tomcat等

如果没有SpringBoot,就用普通的Maven项目加载一个SpingMVC的依赖,
想使用Spring MVC,就要加很多的配置。
				 有了SpringBoot 这些配置就可以省略了
例如:
SpringBoot 默认 页面都在static文件夹下,若没有SpringBoot就要写个配置来说明页面都在哪;

每次启动Spring,内部会启动tomcat,若没有SpringBoot 就要装tomcat软件,
											装完还要配置,每次还都要启动,很麻烦

   Spring Mvc 和 Spring Boot都是Spring家族的成员
 而包括它们在内所有以 Spring 开头为名称的框架 的基本实现都是Spring框架提供的

但实际上Spring框架只提供了两个基本功能:

	Spring框架的核心:IOC 和 AOP
  1. Ioc/DI (控制反转 / 依赖注入)
  2. Aop (面向切面编程)

本课程只讲解1功能的部分,2功能的部分会在整个阶段最后讲解

一、Spring Ioc 控制反转

Ioc(Inversion of Control) 控制反转
要想理解控制反转,需要先理解正常的控制也就是主动控制的概念

(1)主动控制: 我们编写的程序主动控制程序中需要的"组件 / 对象",我们之前 飞机大战 和 webServer项目 都是主动控制的。
  标志就是 需要什么对象实例化什么对象

(2)控制反转: 将程序需要用到的"组件 \ 对象"保存到外部容器中,当需要时从外部容器获取,省去了 构建 或 实例化对象 的复杂过程,从而方便程序使用,提高程序的可扩展性

将一个类的对象保存到Spring容器中
方式一:@Bean (第一个Spring Ioc程序)

创建一个 Maven 项目
在这里插入图片描述在这里插入图片描述

在创建好的 maven 项目中添加 pom.xml依赖
在这里插入图片描述

创建一个类(用于保存到Spring容器)
实体类Hero
在这里插入图片描述
编写 Spring 配置类
将上面的 Hero 类实例化后保存到Spring容器中
新建一个类Config
在这里插入图片描述
创建一个main方法来运行 并从 Spring容器 中获得猪八戒输出信息

反射中包含这个类的所有信息的(有什么方法、属性、方法上加了什么注解等)

  90%的框架 主体的实现都和反射 紧密相关
在这里插入图片描述运行结果:
在这里插入图片描述

使用 Junit 进行测试

一个类只能有一个main方法,使用main方法测试比较麻烦

可以启动junit进行测试
添加pom.xml依赖
在src\test\java中新建包
在这里插入图片描述
包中新建类TestIoc代码如下
在这里插入图片描述一个测试类中可以有多个测试方法
多个测试方法,如果有相同的代码,可以写在@Before或@After注解的方法中
在测试方法运行之前或运行之后执行

代码如下
在这里插入图片描述运行结果:
在这里插入图片描述

方式二:Spring组件扫描功能

将一个类的对象保存到Spring容器中有多重方法
常用的除了上面学习的@Bean保存之外
还有组件扫描的保存方式

步骤:

  1. 定义一个类
  2. 在这个类上添加组件扫描的注解
  3. 编写配置类设置组件扫描的位置
  4. 取出对象使用

定义类添加注解后代码如下
在这里插入图片描述编写配置类StuConfig,设置组件扫描的位置,代码如下

Spring就会扫描 comp 包下,哪些类上加@Component 注解了,加@Component 注解了的类 就会实例化对象 并 保存到容器中
在这里插入图片描述取出对象使用 没有变,即 测试代码没有变化
在这里插入图片描述运行结果:
在这里插入图片描述
只不过因为 没有对属性赋值,所有输出的对象属性是null

如果是 学生、汽车、英雄这种需要赋属性的注入,组件扫描不适合,就应该用@Bean

组件扫描也能赋值:
是在Stu类中赋值,写成死值了,不能变化,在实例化之前就赋上值了
在这里插入图片描述在这里插入图片描述

组件扫描保存方式的注意事项:

① 被扫描的类的类名首字母变成小写就是默认这个类对象的容器中的唯一标识
 但是如果类名是连续的2个以上的大写字母,
 例如 VIPStu,这个类名就会原样保存给容器

② 如果想自定义组件的名称就在@Component注解后面写(),()中定义名称即可
在这里插入图片描述在这里插入图片描述
③ @Component注解 还有几个类似功能的注解,常用的有

 @Controller:标记当前类是控制器
 @Service:标记当前类是业务逻辑
 @Repository:标记当前类是数据访问用

前面写代码 在控制层controller 那里,写@Controller 或 @RestController注解,加上这个注解之后,就意味着 这个controller类就被注入到Spring容器中了,
在程序整个过程中没有实例化过 controller ,但是能用 就是因为加那两个注解了

Spring中:(鼠标放在注解上,然后Ctrl+q,就可以看到)
@Controller  控制器组件

springMVC中的注解:
@RestController  :表示该controller处理请求是异步的
	@RestController注解相当于@ResponseBody + @Controller合在一起的作用
	
@ResponseBoby: 表示将返回的数据封装入response的响应体中.从而实现异步交互.

@controller 和 @Restcontroller
相同点:
	  都是用来表示spring某个类的是否可以接收HTTP请求

区分的原因主要因为这几个主机分别标记在不同功能的类上

  • 什么时候使用组件扫描注入@Component?

当一个类不需要手动进行属性赋值时,可以优先选用组件扫描的注解方式,但是如果有属性要我们程序员来手动赋值就需要使用@Bean的方式

Spring容器中对象的作用域

Spring容器中对象有两种作用域:

  1. singleton(单例的):  一般默认就是单例的
    当前这个对象在Spring容器中只有唯一对象,无论获得多少次,都是同一个对象
     (类似:飞机大战中的天空、英雄机)
  2. prototype(原型的)
    每当从Spring容器中获得这个对象时,Spring都会重新实例化一个对象进行返回
     (类似:飞机大战中的小敌机、大敌机、小蜜蜂)

默认情况下Spring容器中的对象时singleton,下面来测试一下
在这里插入图片描述

Spring对象实例化时机 和 惰性初始化
Spring容器对象初始化时机

上面讲了单例和原型两种作用域
因为它们对象作用域的不同导致它们会在不同的时机进行对象的实例化操作

  • 单例的默认是解析Config类时就会实例化

  • 而原型的默认是获得对象时再实例化,不获取就不实例化

先使用Hero进行单例的测试
在Hero类中添加无参构造

对象懒加载(惰性初始化)

针对单例对象会出现下面的问题

项目中所有Spring容器中的单例对象都会在Spring启动时加载实例化,这样就会比较消耗时间,如果其中有可能用不到的对象,也会在这时实例化,增加启动时间

我们可以将这些可能用不到的对象 设置为 惰性初始化的模式
这样这个对象就不会再Spring启动时进行实例化了,
当程序真正需要这个对象时再进行实例化

Spring DI 依赖注入

Spring Ioc和DI都是控制反转的思想
但是DI特指一个操作,这个操作就是依赖注入

什么是依赖

所谓"依赖"指程序中一个类的方法中需要使用到另一个类的对象
这两个类就是依赖关系
如果类A的方法中需要使用类B,我们说类A依赖类B

关羽有一个战斗的方法,这个方法中需要使用青龙偃月刀,我们就说关羽依赖青龙偃月刀来战斗
代码如下:

定义关羽和青龙偃月刀类
DragonBlade

依赖注入的实现
使用组件扫描实现依赖注入
Spring DI 解耦
什么是耦合性
实现解耦的操作
@Bean和组件扫描混用
二、Spring Aop 面向切面编程

Spring 框架的两大功能

1.Ioc\DI

2.Aop

因为是Spring框架的核心功能,所以实现Aop不需要添加任何依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值