Spring框架、01SpringIOC

SpringIOC

Spring介绍

Spring

  • Spring 是一款目前主流的JavaEE开源框架,由Rod Johnson提出并创立

  • Spring 框架的目的是用于简化开发,目前流行版本是5.x系列,官网地址Spring | Home

  • Spring全称 Spring Framework,其主要功能有:

    1. IOC: 控制反转,轻松实现层间解耦

    2. AOP: 面向切面编程,轻松实现公共代码抽取

    3. MVC: 开发web应用程序

    4. 事务: 无需编写代码,即可实现数据库事务管理

    5. 测试: 与测试框架集成、web 单元测试

控制反转

IOC概念

从面向接口编程谈起

  • 当持久层的类由DeptDaoImpl切换为DeptDaoImpl2后,业务层的代码也要跟随发生改变 这就说明两层代码之间依然存在耦合关系

SpringIOC思想

  • SpringIOC思想的核心是改变了对象的创建者和关系维护者

使用Spring之前

  • 对象都是由程序员主动创建,并且按照需求建立依赖关系,具体做法如下:

    1. 程序员会先编写Dao和Service类,然后创建二者对象

    2. 将dao的对象赋值到service中的deptDao属性上

使用Spring之后

  • 对象由Spring创建,并且按照需求建立依赖关系

    1. 程序员编写Dao和Service类,并声明依赖关系

    1. 在Dao和Service的类上添加注解,让Spring创建对象

    1. 在service中deptDao属性上添加注解,Spring完成赋值

IOC小结

  • 概念

    IOC(控制 反转)是一种设计思想,它的目的是指导我们设计出更加松耦合的程序

    1. 控制:指的是对象创建权

    1. 反转:指的对象的创建由程序员在类中主动创建反转到由Spring容器来创建

入门案例

通过Spring帮我们创建对象步骤分析

  1. 创建工程,添加依赖

  1. 创建DeptDao的接口和实现类

  1. 创建Spring配置类

  1. 创建测试类,编写测试方法

  1. 在方法中创建IOC容器,并从容器中获取DeptDao对象

案例细节

Bean创建

  • 使用@Component定义bean

    1. 支持使用value属性指定beanbean在容器中的唯一标识

    2. 当我们不写时,它的默认值是当前类名首字母改小写

  • Spring提供@Component注解的三个衍生注解,他们功能跟@Component类似,但是要标注在指定层的类上

    1. @Controller:用于表示层bean定义

    2. @Service:用于业务层bean定义

    3. @Repository:用于数据层bean定义

    推荐使用这三个,当一个类实在不好归属在这三个层上时,再使用@Component

Bean作用范围

  • 在类上使用@Scope注解定义Bean的作用域,Spring支持如下五种作用域,我们目前常用的是第一种

    1. singleton 单例,对于一个类,只会创建一个对象,每次从容器中获取,拿到的都是这个对象

    2.  prototype 多例,对于一个类,每次从容器中获取,都会创建一次,得到一个新的对象

    3. request 在web环境中,每个请求范围内会创建新的对象

    4. session 在web环境中,每个会话范围内会创建新的对象

    5. application 在web环境中,每个应用范围内会创建新的对象

Bean创建时机

  • 单例对象默认情况下,在容器启动时被创建(可以使用@Lazy注解延迟到第一次使用时创建)

  • 多例对象,在每一次使用该bean的时候创建

Bean获取

  • Spring容器启动时,会把其中的bean都创建好,如果想要主动获取这些bean,可以使用容器getBean()方法

    1. getBean("id") 使用bean的id从容器中查找对象

    1. getBean(Bean.class) 使用bean的class类型从容器中查找对象

    1. getBean("id",Bean.class) 使用bean的id和class类型从容器中查找对象

  • 常见报错

    1. 查找的id在容器中不存在 NoSuchBeanDefinitionException: No bean named 'deptDaoImpl1' available

    2. 查找的指定类型的对象在容器中不存在 NoSuchBeanDefinitionException: No qualifying bean of type 'DeptDao' available

    3. 查找的指定类型的对象在容器中存在多个 NoUniqueBeanDefinitionException: No qualifying bean of type 'com.itheima.dao.DeptDao' available: expected single matching bean but found 2: deptDaoImpl,deptDaoImpl2

依赖注入

入门案例

依赖注入(DI) : 依赖注入就是对对象中的属性进行赋值

通过Spring帮我们完成依赖注入步骤分析

  1. 创建Service接口和实现类

  2. 在Service中声明需要的dao对象(Spring会自动完成赋值)

  3. 创建IOC容器,从容器中获取service对象进行测试

@Autowired

  • 标注在属性上,表示自动依赖注入,Spring会根据被标注对象的类型自动从IOC容器中查找

    1. 如果找不到,就会报错 NoSuchBeanDefinitionException

    1. 如果恰好找到一个,就会自动完成依赖注入

    1. 如果找到了多个,也会报错 NoUniqueBeanDefinitionException

案例细节

@Qualifier

  1. 标注在要赋值的属性上,代表在按照类型匹配的基础上,再按照指定名称匹配

  1. 注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

@Primary

  1. @Primary标注在实现类上,表示当一个接口有多个实现的类时,默认使用哪个作为主实现

  2. 注意:在同一个接口下,不能同时在多个实现类设置

构造器和Set方式

  • 依赖注入不止@Autowired注解这一种方式,还有构造器方式和set方式

管理第三方Bean

创建数据源对象

引入

  • 前面我们已经学习了如何使用注解将自己创建的类的对象放入Spring容器

那么如果这个类不是我们自己写的,是第三方通过jar包提供, 我们无法改动类添加注解,此时应该怎样创建对象放入Spring容器呢?

  • 这时候就用到了@Bean注解了,下面我们使用DruidDataSource对象的创建来演示这个注解的使用

向Spring容器中放入DruidDataSource对象步骤分析

  1. 添加依赖

  2. 创建数据源对象,使用@Bean将对象放入容器

  3. 编写测试方法,并从容器中获取数据源对象

  • @Bean:写在方法上,表示将该方法的返回对象放到Spring容器中,在容器中的标识默认是方法名

配置类优化

@Configuration:写在类上,表示该类是一个配置类,Spring在启动的时候会自动扫描加载类中的配置

Spring整合Mybatis

整合思想

MyBatis核心配置

MyBatis核心对象

Spring整合mybatis

整合思想

  • 使用Mybatis,最关键是要让它产生Mapper的代理对象,流程如下: Mapper代理对象-->sqlSession对象-->SqlSessionFactory对象

  • 因此只要想办法让Spring创建出SqlSessionFactory,自然就可以获得Mapper对象 而要让Spring创建SqlSessionFactory就需要将数据源和mapper位置提前告诉Spring

整合实现

持久层实现步骤分析

  1. 准备数据库\表

  2. 创建工程,添加依赖

  3. 创建实体类

  4. 创建Mapper接口,编写查询列表方法

  5. 创建配置类,配置mapper位置、数据源、sqlSessionFactory

  6. 创建测试类,获取Mapper对象,测试查询方法

业务层实现步骤分析

  1. 创建service接口,编写查询列表方法

  2. 创建service实现类,注入mapper对象,编写查询列表方法

  3. 创建测试类,获取service对象,测试查询方法

增删改查实现步骤分析

  1. 在Mapper接口中实现新增、主键查询、修改、删除方法

  2. 在Service接口中实现新增、主键查询、修改、删除方法

  3. 在Service实现类中实现新增、主键查询、修改、删除方法

  4. 在测试类中测试新增、主键查询、修改、删除方法

测试类优化

测试类优化

  • Spring对Junit的单元测试进行了封装,形成了自己的单元测试 使用Spring单元测试,代码更加简单

注解总结

注解作用
@Component @Controller @Service @Repository标注在自己开发的类上,用于将当前类对象放入Spring容器
@Bean标注在配置类中的方法上,用于将方法的返回值对象放入Spring容器
@Autowired标注在类中的属性上,用于从Spring容器中获取属性的值
@Qualifier @Primary依赖注入时,根据一个接口查到了多个对象,使用这两个注解确定使用哪个对象
@Scope标注在类上,声明对象是单例还是多例
@Configuration标注在配置类上,Spring容器启动时会自动加载类中的配置
@ComponentScan标注在主配置类上,用于声明包扫描的范围
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值