1. 资料分析
课堂资料: feiQ中会实时共享
要求大家有纸笔: 课堂的一些重点记下来
typora(设置皮肤、高亮、左侧栏合并)
2. 学习
难度慢慢变大, 对于记不住的,一定要回看视频,不要嫌麻烦
晚自习,要学会自己整理当天的知识点
3. 环境
Jdk11 (运行cmd启动dos窗口, 使用下面命令查看 java -version 大版本不是11的必须更换)
maven仓库
idea全局配置: maven位置和字符集
Spring介绍
Spring 是一款目前主流的 Java EE 轻量级、全栈型、开源框架 ,Rod Johnson 提出并创立,目的是用于简化开发,目前流行版本是5系列
Spring全称 Spring Framework,其功能有:
- IOC-控制反转,轻松实现层间解耦
- AOP- 面向切面编程,轻松实现公共代码抽取
- MVC - 开发web应用程序
- 事务 - 无需编写代码,即可实现数据库事务管理
- 测试 - 与测试框架集成、web 单元测试
体系架构图
控制反转(IOC)
概念
问题引入
通过前面的学习,我们已经学会了使用三层架构开发程序,也就是
web--->service--->dao
,但是在调用的时候层与层之间存在者代码耦合
观察发现:当service层把实现类由UserServiceImpl换成UserServiceImpl2后,web层的代码也要跟着改动,这就说明两层代码之间是有耦合的
解决思路
Spring解决上述问题的思路其实很简单,它改变了对象的创建者
传统方式:servlet需要service了,就是由Servlet主动创建
Spring方式:所有的对象都是由Spring框架提前创建出来,存储到一个容器中,servlet需要Service了,就向Spring要一个
IOC概念
IOC( 控制 反转 )是一种设计思想,它的目的是指导我们设计出更加松耦合的程序
控制:指的是对象创建权
反转:指的对象的创建由程序员在类中主动创建反转到由Spring容器来创建
入门案例
此案例我们来学习
如何让Spring帮我们创建对象
创建空工程
① 创建空工程
② 退出idea,删除工程下面的.idea目录
③ 重新使用idea打开工程
④ 设置全局jdk
⑤ 检查maven配置
创建模块,加入依赖
<dependencies>
<!--spring核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.16</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
创建接口和实现类
添加配置类
@ComponentScan(“com.itheima”) 注解扫描(也叫组件扫描), 只有这里指定的包(及其子包)下类中的注解才会被Spring扫描
测试
案例细节
Bean创建
向Spring中声明自己开发的类对象的注解,主要有下面四个
* @Component
用于实例化对象,它支持一个value属性类定义bean在容器中的唯一标识
如果不写,默认值为类名的首字母小写
* @Controller @Service @Repository
这三个注解的功能跟@Component类似,他们分别标注在不同的层上。
@Controller 标注在表示层的类上
@Service 标注在业务层的类上
@Repository 标注在持久层的类上
推荐使用这三个,当一个类实在不好归属在这三个层上时,再使用@Component
Bean作用域
在类上使用@Scope注解定义Bean的作用域,Spring支持如下五种作用域,我们目前常用的是第一种
@Lazy 延迟。可以把类的创建延迟到第一次使用
- singleton 单例,对于一个类,只会创建一个对象,每次从容器中获取,拿到的都是这个对象
- prototype 多例,对于一个类,每次从容器中获取,都会创建一次,得到一个新的对象
- request 在web环境中,每个请求范围内会创建新的对象
- session 在web环境中,每个会话范围内会创建新的对象
- application 在web环境中,每个应用范围内会创建新的对象
① 单例对象
对于一个类来说,只会创建一个对象,每次从容器中获取,拿到的都是这个对象
② 多例对象
对于一个类,每次从容器中获取都会创建一次,得到一个新的对象
Bean创建时机
① 单例对象
默认情况下,单例对象会在容器创建时就创建;也可以使用@Lazy将创建时机延迟到
第
一次获取的时候创建
② 多例对象
多例对象会在
每
次获取的时候才创建
Bean获取
Spring容器启动时,会把其中的bean都创建好,如果想要主动获取这些 bean,可以使用容器getBean()方法
- getBean("id") 使用bean的id从容器中查找对象
- getBean(Bean.class) 使用bean的class类型从容器中查找对象
- getBean("id",Bean.class) 使用bean的id和class类型从容器中查找对象
* 如果查找的id在容器中不存在,会报错
NoSuchBeanDefinitionException: No bean named 'deptDaoImpl1' available
* 如果查找的类型在容器中不存在,会报错
NoSuchBeanDefinitionException: No qualifying bean of type 'DeptDao' available
* 如果查找的类型在容器中存在多个,会报错
NoUniqueBeanDefinitionException: No qualifying bean of type 'com.itheima.dao.DeptDao'
available: expected single matching bean but found 2: deptDaoImpl,deptDaoImpl2
依赖注入(DI)
案例
此案例我们来学习
如何让Spring帮我们完成对象属性的赋值
创建Service接口和实现类
在Service中获取dao对象
测试
细节
@Autowired
@Autowired注解,默认是按照类型进行属性的赋值,如果存在多个相同类型的bean,就会报错
@Qualifier
跟@Autowired联合使用,标注在要赋值的属性上,代表在按照类型匹配的基础上,再按照指定名称匹配
@Primary
@Primary标注在实现类上,表示当一个接口有多个实现的类时,默认使用哪个作为主实现
管理第三方Bean
前面我们已经学习了如何使用注解将自己创建的类的对象放入容器,那么如何将第三方提供的类创建对象放入Spring容器呢?
这时候就用到了
@Bean
注解了,下面我们使用DruidDataSource对象的创建
来演示这个注解的使用
创建数据源对 象
将DruidDataSource对象放入Spring容器
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
将对象放入容器
@Bean:写在方法上,表示将该方法的返回对象放到Spring容器中,在容器中的标识默认是方法名
从容器中获取对象
配置类优化
@Configuration:写在类上,表示该类是一个配置类,Spring在启动的时候会自动扫描加载类中的配置
整合Mybatis
本章节我们使用Spring整合mybatis,来完成一套增删改查的案例
整合思想
使用Mybatis,最关键是要让它产生Mapper的代理对象,流程如下:
Mapper代理对象–>sqlSession对象–>SqlSessionFactory对象
因此只要想办法让Spring创建出SqlSessionFactory,自然就可以获得Mapper对象
而要让Spring创建SqlSessionFactory就需要将数据源和mapper位置提前告诉Spring
持久层实现
准备数据环境
create database spring;
use spring;
-- 部门管理
create table dept(
id int unsigned primary key auto_increment comment '主键ID',
name varchar(10) not null unique comment '部门名称',
createTime datetime not null comment '创建时间',
updateTime datetime not null comment '修改时间'
) comment '部门表';
insert into dept (id, name, createTime, updateTime)
values(1,'学工部',now(),now()),
(2,'教研部',now(),now()),
(3,'咨询部',now(),now()),
(4,'就业部',now(),now()),
(5,'人事部',now(),now());
创建模块,导入依赖
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.16</version>
</dependency>
<!--spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.16</version>
</dependency>
<!--spring-mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.16</version>
</dependency>
</dependencies>
创建实体类
创建Mapper接口
提供配置类
测试
业务层实现
创建service接口
创建service实现类
测试
增删改查
新增
主键查询
修改
删除
测试类优化
Spring对Junit的单元测试进行了封装,形成了自己的单元测试,使用Spring单元测试,代码更加简单
注解总结
注解 | 作用 |
---|---|
@Component @Controller @Service @Repository | 标注在自己开发的类上,用于将当前类对象放入Spring容器 |
@Bean | 标注在配置类中的方法上,用于将方法的返回值对象放入Spring容器 |
@Autowired | 标注在类中的属性上,用于从Spring容器中获取属性的值 |
@Qualifier @Primary | 依赖注入时,根据一个接口查到了多个对象,使用这两个注解确定使用哪个对象 |
@Scope | 标注在类上,声明对象是单例还是多例 |
@Configuration | 标注在配置类上,Spring容器启动时会自动加载类中的配置 |
@ComponentScan | 标注在主配置类上,用于声明包扫描的范围 |
- 整理核心知识点
- 编程题
|
| | |
| @Scope | 标注在类上,声明对象是单例还是多例 |
| @Configuration | 标注在配置类上,Spring容器启动时会自动加载类中的配置 |
| @ComponentScan | 标注在主配置类上,用于声明包扫描的范围 |
- 整理核心知识点
- 编程题
- 复习(看视频)