Spring学习——SpringIOC

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标注在主配置类上,用于声明包扫描的范围
  1. 整理核心知识点
  2. 编程题
    |
    | | |
    | @Scope | 标注在类上,声明对象是单例还是多例 |
    | @Configuration | 标注在配置类上,Spring容器启动时会自动加载类中的配置 |
    | @ComponentScan | 标注在主配置类上,用于声明包扫描的范围 |
  1. 整理核心知识点
  2. 编程题
  3. 复习(看视频)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值