浅谈 Spring IOC 和 DI 以及 Spring 整合 Mybatis 的十四 个注解

IOC 控制反转

控制 : 指对对象的创建权
反转: 对象的创建由程序员在类中主动创建变为由Spring自动创建

Spring方式:所有的对象都是由Spring框架提前创建出来,存储到一个容器中,servlet需要Service了,就向Spring要一个

技术的作用 : 通过底层反射原理来解开对象之间的耦合

Bean的创建

注解 @Component

支持使用value属性指定beanbean在容器中的唯一标识
当我们不写时,它的默认值是当前类名首字母改小写

@Component的三个衍生注解

@Controller 用来标记是控制层类,并且添加到Spring容器中
@Service 用来标记是业务层类,并且添加到Spring容器中
@Repository 用来表姐是持久层类,并且添加到Spring容器中

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

Bean作用范围

@Scope

在类上使用@Scope注解定义Bean的作用域,Spring支持如下五种作用域,我们目前常用的是第一种,默认是第一种单例模式
singleton 单例,对于一个类,只会创建一个对象,每次从容器中获取,拿到的都是这个对象 此模式下创建的对象是同一个,地址是一样的,可以通过==运算符进行判断
prototype 多例,对于一个类,每次从容器中获取,都会创建一次,得到一个新的对象
request 在web环境中,每个请求范围内会创建新的对象
session 在web环境中,每个会话范围内会创建新的对象
application 在web环境中,每个应用范围内会创建新的对象

在这里插入图片描述

Bean创建时机

默认情况下,使用的是单例模式,对象会随着容器的启动自动创建,也就是立即创建,但是可以通过注解来控制bean对象的创建时机@Lazy使对象的创建成为延迟加载的方式,即使用时再进行创建
在这里插入图片描述

Bean获取

Spring容器启动时,会把其中的bean都创建好,如果想要主动获取这些bean,可以使用容器getBean()方法
getBean(“id”) 使用bean的id从容器中查找对象(最多)
getBean(Bean.class) 使用bean的class类型从容器中查找对象(一般是父类或父接口类型)
getBean(“id”,Bean.class) 使用bean的id和class类型从容器中查找对象

在这里插入图片描述

3中常见报错及解决方案

在这里插入图片描述
ps : 还有 SpringConfig 类的包扫描 @CompentenScan(“com.itheima”)

因此还要检查确定包扫描的范围

DI 依赖注入

解释:依赖注入就是对对象中的属性进行赋值

假如有一个父接口studentService为例,有其实现类StudentServiceImpl,使用依赖注入可以将实现类的属性值自动注入到父类对象中。
或者以StudentDao接口为例,在业务层中定义StudentMapper父接口类型,可以使用依赖注入让程序在执行过程中动态创建StudentMapper实现类并将属性值动态注入到父接口中,从而来达到降低耦合的效果。

@Autowired注解

@AutoWired 注解 标注在对象的声明上,表示自动注入该对象
标注在属性上,表示自动依赖注入,Spring会根据被标注对象的类型自动从IOC容器中查找
在这里插入图片描述

两个常见问题

如果找不到,就会报错 NoSuchBeanDefinitionException
如果恰好找到一个,就会自动完成依赖注入
如果找到了多个,也会报错 NoUniqueBeanDefinitionException

多个实现类—2种解决方案

① @Qualifier
标注在要赋值的属性上,代表在按照类型匹配的基础上,再按照指定名称匹配
注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用
在这里插入图片描述
② @Primary
@Primary标注在实现类上,表示当一个接口有多个实现的类时,默认使用哪个作为主实现
注意:在同一个接口下,不能同时在多个实现类设置
在这里插入图片描述

③ 轻松一刻

这里就用到了老师讲的一个例子,多个实现类的自动装配就好比一个男生和多个女生相亲一样,当男生这边没考虑好要选那个当女朋友时,媒人@Primary的作用就来了,媒人会主动推荐一个供你选择,当@primary和@Qualifier同时存在时问题又来了,听媒人的还是自己喜欢的,最终的决定权当然还是在男生手中@Qulifier(“选择”)选择谁,谁就作为实现类。

关于报错排查步骤

  1).要确定类上使用了@Component注解(衍生注解)
  2).要确定此类实现了接口
  3). 要确定包扫描

管理第三方Bean

如果这个类不是我们自己写的,是第三方通过jar包提供,
我们无法改动类添加注解,此时应该怎样创建对象放入Spring容器呢?
这时候就用到了@Bean注解了,下面我们使用DruidDataSource对象的创建来演示这个注解的使用

@Bean 注解

@Bean:写在方法上,表示将该方法的返回对象放到Spring容器中,在容器中的标识默认是方法名
在这里插入图片描述

配置类优化

所有的@Bean都可以写在Springconfig配置类下,但是这样看起来或许会分不清哪个配置是起的什么作用,这时候又有一个注解@Configration可以将各自的@Bean单独存放起来,一下子是不是就明朗了起来!

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

Spring整合Mybatis

在Mybatis的配置文件中有两个比较重要的配置 毫无疑问,就是数据库环境datasource数据源以及mapper的位置相关配置
再有就是Mybatis的工具类中的 SqlSessionFactory 工厂 SQLSession会话 以及 通过瑟瑟诶on获取mapper 事务的提交和连接的关闭这些

在这里插入图片描述
在这里插入图片描述

整合思想

在这里插入图片描述

整合实现

持久层实现

准备数据库和数据表
创建工程,添加依赖
创建实体类
创建Mapper接口,编写查询列表方法
创建配置类,配置mapper位置、数据源、sqlSessionFactory
创建测试类,获取Mapper对象,测试查询方法

业务层实现

创建service接口,编写查询列表方法
创建service实现类,注入mapper对象,编写查询列表方法
创建测试类,获取service对象,测试查询方法

在这里插入图片描述

测试类优化

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

这就又需要两个注解 @RunWith(SpringJUnit4ClassRunner.class)

相当于Spring的启动 ACAC context = new ACAC();

和注解 @ContextConfiguration(classes = SpringConfig.class)

相当于ACAC()的参数配置类
在这里插入图片描述

注解及作用总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PY_XAT_SFZL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值