SpringIOC
Spring介绍
Spring
-
Spring 是一款目前主流的JavaEE开源框架,由Rod Johnson提出并创立
-
Spring 框架的目的是用于简化开发,目前流行版本是5.x系列,官网地址Spring | Home
-
Spring全称 Spring Framework,其主要功能有:
-
IOC: 控制反转,轻松实现层间解耦
-
AOP: 面向切面编程,轻松实现公共代码抽取
-
MVC: 开发web应用程序
-
事务: 无需编写代码,即可实现数据库事务管理
-
测试: 与测试框架集成、web 单元测试
-
控制反转
IOC概念
从面向接口编程谈起
-
当持久层的类由DeptDaoImpl切换为DeptDaoImpl2后,业务层的代码也要跟随发生改变 这就说明两层代码之间依然存在耦合关系
SpringIOC思想
-
SpringIOC思想的核心是改变了对象的创建者和关系维护者
使用Spring之前
-
对象都是由程序员主动创建,并且按照需求建立依赖关系,具体做法如下:
-
程序员会先编写Dao和Service类,然后创建二者对象
-
将dao的对象赋值到service中的deptDao属性上
-
使用Spring之后
-
对象由Spring创建,并且按照需求建立依赖关系
-
程序员编写Dao和Service类,并声明依赖关系
-
在Dao和Service的类上添加注解,让Spring创建对象
-
在service中deptDao属性上添加注解,Spring完成赋值
-
IOC小结
-
概念
IOC(控制 反转)是一种设计思想,它的目的是指导我们设计出更加松耦合的程序
-
控制:指的是对象创建权
-
反转:指的对象的创建由程序员在类中主动创建反转到由Spring容器来创建
-
入门案例
通过Spring帮我们创建对象步骤分析
-
创建工程,添加依赖
-
创建DeptDao的接口和实现类
-
创建Spring配置类
-
创建测试类,编写测试方法
-
在方法中创建IOC容器,并从容器中获取DeptDao对象
案例细节
Bean创建
-
使用@Component定义bean
-
支持使用value属性指定beanbean在容器中的唯一标识
-
当我们不写时,它的默认值是当前类名首字母改小写
-
-
Spring提供@Component注解的三个衍生注解,他们功能跟@Component类似,但是要标注在指定层的类上
-
@Controller:用于表示层bean定义
-
@Service:用于业务层bean定义
-
@Repository:用于数据层bean定义
推荐使用这三个,当一个类实在不好归属在这三个层上时,再使用@Component
-
Bean作用范围
-
在类上使用@Scope注解定义Bean的作用域,Spring支持如下五种作用域,我们目前常用的是第一种
-
singleton 单例,对于一个类,只会创建一个对象,每次从容器中获取,拿到的都是这个对象
-
prototype 多例,对于一个类,每次从容器中获取,都会创建一次,得到一个新的对象
-
request 在web环境中,每个请求范围内会创建新的对象
-
session 在web环境中,每个会话范围内会创建新的对象
-
application 在web环境中,每个应用范围内会创建新的对象
-
Bean创建时机
-
单例对象默认情况下,在容器启动时被创建(可以使用@Lazy注解延迟到第一次使用时创建)
-
多例对象,在每一次使用该bean的时候创建
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对象(Spring会自动完成赋值)
-
创建IOC容器,从容器中获取service对象进行测试
@Autowired
-
标注在属性上,表示自动依赖注入,Spring会根据被标注对象的类型自动从IOC容器中查找
-
如果找不到,就会报错 NoSuchBeanDefinitionException
-
如果恰好找到一个,就会自动完成依赖注入
-
如果找到了多个,也会报错 NoUniqueBeanDefinitionException
-
案例细节
@Qualifier
-
标注在要赋值的属性上,代表在按照类型匹配的基础上,再按照指定名称匹配
-
注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用
@Primary
-
@Primary标注在实现类上,表示当一个接口有多个实现的类时,默认使用哪个作为主实现
-
注意:在同一个接口下,不能同时在多个实现类设置
构造器和Set方式
-
依赖注入不止@Autowired注解这一种方式,还有构造器方式和set方式
管理第三方Bean
创建数据源对象
引入
-
前面我们已经学习了如何使用注解将自己创建的类的对象放入Spring容器
那么如果这个类不是我们自己写的,是第三方通过jar包提供, 我们无法改动类添加注解,此时应该怎样创建对象放入Spring容器呢?
-
这时候就用到了@Bean注解了,下面我们使用DruidDataSource对象的创建来演示这个注解的使用
向Spring容器中放入DruidDataSource对象步骤分析
-
添加依赖
-
创建数据源对象,使用@Bean将对象放入容器
-
编写测试方法,并从容器中获取数据源对象
-
@Bean:写在方法上,表示将该方法的返回对象放到Spring容器中,在容器中的标识默认是方法名
配置类优化
@Configuration:写在类上,表示该类是一个配置类,Spring在启动的时候会自动扫描加载类中的配置
Spring整合Mybatis
整合思想
MyBatis核心配置
MyBatis核心对象
Spring整合mybatis
整合思想
-
使用Mybatis,最关键是要让它产生Mapper的代理对象,流程如下: Mapper代理对象-->sqlSession对象-->SqlSessionFactory对象
-
因此只要想办法让Spring创建出SqlSessionFactory,自然就可以获得Mapper对象 而要让Spring创建SqlSessionFactory就需要将数据源和mapper位置提前告诉Spring
整合实现
持久层实现步骤分析
-
准备数据库\表
-
创建工程,添加依赖
-
创建实体类
-
创建Mapper接口,编写查询列表方法
-
创建配置类,配置mapper位置、数据源、sqlSessionFactory
-
创建测试类,获取Mapper对象,测试查询方法
业务层实现步骤分析
-
创建service接口,编写查询列表方法
-
创建service实现类,注入mapper对象,编写查询列表方法
-
创建测试类,获取service对象,测试查询方法
增删改查实现步骤分析
-
在Mapper接口中实现新增、主键查询、修改、删除方法
-
在Service接口中实现新增、主键查询、修改、删除方法
-
在Service实现类中实现新增、主键查询、修改、删除方法
-
在测试类中测试新增、主键查询、修改、删除方法
测试类优化
测试类优化
-
Spring对Junit的单元测试进行了封装,形成了自己的单元测试 使用Spring单元测试,代码更加简单
注解总结
注解 | 作用 |
---|---|
@Component @Controller @Service @Repository | 标注在自己开发的类上,用于将当前类对象放入Spring容器 |
@Bean | 标注在配置类中的方法上,用于将方法的返回值对象放入Spring容器 |
@Autowired | 标注在类中的属性上,用于从Spring容器中获取属性的值 |
@Qualifier @Primary | 依赖注入时,根据一个接口查到了多个对象,使用这两个注解确定使用哪个对象 |
@Scope | 标注在类上,声明对象是单例还是多例 |
@Configuration | 标注在配置类上,Spring容器启动时会自动加载类中的配置 |
@ComponentScan | 标注在主配置类上,用于声明包扫描的范围 |