深入理解Spring(IOC)(二)

回顾:
上一篇讲道springIOC 与DI自动装配的一些方法
1、spring实现IOC的思路和方法
2、@Autowired与@Resource:的区别对比
3、Singleton Beans with Prototype-bean Dependencies引发的一些问题见 上一篇博客
接上篇:

1、spring声明周期和回调

参考文档:
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-lifecycle
spring生命周期回调的方式有一下三种
1、Methods annotated with @PostConstruct
2、afterPropertiesSet() as defined by the InitializingBean callback interface
3、A custom configured init() method
**
为什么要了解生命周期和回调?
1、我们要彻底搞懂spring 整个运行的过程。所以我们要了解spring运行的轨迹。
2、我们的目标是深入搞懂spring原理!后面源码会重点介绍这里

测试

1、Methods annotated with @PostConstruct
如下图,官网中也有讲道。XML与注解方式实现,spring生命周期的初始化,与销毁!
在这里插入图片描述
在这里插入图片描述
2、afterPropertiesSet() as defined by the InitializingBean callback interface
1、spring初始化实现InitializingBean接口重写afterPropertiesSet完成初始化。可以发现构造方法执行完成后再执行初始化方法,
应用场景 :某些场景,组件的加载可以重写初始化方法在里面做一些组件加载
2、销毁方法,spring容器销毁时候执行实现DisposableBean接口 重写destroy() 方法!
在这里插入图片描述
3、A custom configured init() method
自定义一个方法完成XML配置,官网有介绍。。
在这里插入图片描述
总结: 本人觉得注解的方式最优雅,实现接口。代码API侵入性太强,XML方式太过繁琐。

2、扫描排除

如下图,正常包扫描,会扫描出自定义下包下的所有类。有些工具类如果我们不想要它扫描到怎么办呢?
在这里插入图片描述
(方法一)如下图:(排除某一个类)
在这里插入图片描述
方法二 排除整个包
眼尖的小哥哥 已经发现,排除某一个类。一旦没找到,则会报错,不初始化任何类。而排除整个包。会初始化其他包下的类信息。(面试的时候小心被挖坑
在这里插入图片描述

spring IOC部分总结:

看到这里,大家应该搞懂了什么是IOC,思考一下 其他框架怎么跟spring整合?
spring 依赖注入,与自动装配。只能自己玩?那不是很low?作者初心抱着彻底搞懂SpringIOC的心态
如下图,spring java Configuration方式整合mybatis
参考文档:
1、mybatis官网
2、mybatis整合spring中文官网
A:通过mybatis官网可以发现,要使用mybatis先要实例化SqlSessionFactory,spring初衷new的这个动作交给spring去管理。而且 SqlSessionFactory是一个接口不能实例化。那怎么办呢?于是mybatis官方整合了一个mybatis-spring的jar包
在这里插入图片描述
如图所示:mybatis整合spring, 实例化SqlSessionFactoryBean SqlSessionFactoryBean实现了SqlSessionFactory传入DataSource对象则实现了,spring与mybatis的整合。完成了框架整合,并且mybatis交给了spring管理。完成了springIOC功能!
在这里插入图片描述在这里插入图片描述

3、spring循环引用问题

原因分析: 如图IndexService 引用TestService ,TestService引用IndexService 。是否会报错?
在这里插入图片描述在这里插入图片描述
解答: 这种依赖是不会报错。
原因分析:大致分为如下三个步骤。后面spring源码分析时,会讲道这里
在这里插入图片描述
3、(面试问题)什么时候会产生循环依赖的问题?
当两个类为 原型@Scope(“prototype”)时候,由于原型时,没有缓存区。。见上图。假设IndexService初始化。需要依赖TestService。这个时候spring去getBean由于TestService还没有初始化。就会报错。。因为没有缓存区。TestService还没有没初始化()
在这里插入图片描述
**

4、(面试题@Profile有什么作用?)@Profile注解用法,与多配置类演示

如图所示:Spring2配置类,扫描com.bing.dao 而spring配置类扫描com.bing.service
在这里插入图片描述
在这里插入图片描述
如图所示:启用profiles2文件,则会报错!!因为Spring2不扫描service下的文件。利用@Profile我们就可以灵活切换数据源,与配置。多生产环境。可以灵活部署。
在这里插入图片描述
在这里插入图片描述
**
SpringIOC部分内容就整理到这里。相信读者认真学习已经有所收获吧!接下来。会整理,AOP与spring源码部分。。** 持续关注。学习也好,复习也好,不迷路**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章