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()的参数配置类文章来源:https://www.toymoban.com/news/detail-603083.html
注解及作用总结
文章来源地址https://www.toymoban.com/news/detail-603083.html
到了这里,关于浅谈 Spring IOC 和 DI 以及 Spring 整合 Mybatis 的十四 个注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!