spring的IOC原理,容器管理的bean类型、bean的生命周期
1.什么是IOC
(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
(2)使用 IOC 目的:为了耦合度降低
为什么IOC可以极大的降低耦合度?
(1)原始版:一般我们想使用userDao中的方法时,会在调用地创建userDao的对象,当userDao对象包名更改或者方法名更改时,也同时要修改userService中的代码,耦合度很高!
(2)进阶版,使用工厂模式生成userDao对象,解决了service和dao的耦合,但是dao和factory又耦合
(3)最终版 IOC
2.IOC底层原理
由上图可知ioc的底层技术其实就是 xml 解析、工厂模式、反射
IOC容器的底层就是对象工厂(类似于上边的factory) beanFactory
Spring 提供 IOC 容器实现两种方式:(两个接口)
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象(类似于懒加载)
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用
加载配置文件时候就会把在配置文件对象进行创建
为什么开发时多使用ApplicationContext?
当前应用大部分是web应用,在请求时如果还要创建对象 将非常耗时,所以在容器启动时,你可多耗费一点时间把所有对象创造完成,减少请求时间,提高访问速度。
3.spring容器管理的bean类型
Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型
3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样(主要用于自定义一些具有复杂逻辑的bean对象)
//第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBeanpublic class MyBean implements FactoryBean<Course> {//定义返回 bean@Overridepublic Course getObject() throws Exception {Course course = new Course();course.setCname("abc");return course;}@Overridepublic Class<?> getObjectType() {return null;}@Overridepublic boolean isSingleton() {return false;}}//第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型<bean id = "myBean" class="com.atguigu.spring5.factorybean.MyBean" ></bean >@Testpublic void test3 () {ApplicationContext context =new ClassPathXmlApplicationContext("bean3.xml");Course course = context.getBean("myBean", Course.class); //返回类型并不是MyBean,和普通bean不一样的System.out.println(course);}
4.bean的生命周期
一共七步:
(1)通过构造器创建 bean 实例(无参数构造)
(2)bean的属性赋值(调用 set 方法)
(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
注意:
postProcessBeforeInitialization方法会在每个bean的初始化之前被调用一次; 如果当前的bean实现了某个xxxWare接口,那么它的某个对应的方法就会被调用,例如我们创建了一个bean实现了ApplicationContextAware接口,那么这个bean的setApplicationContext方法就会被调用,入参是applicationContext成员变量,这样我们的bean就能得到applicationContext对象了;
展开上图中标红的方法即可看到
private void invokeAwareInterfaces(Object bean) {if (bean instanceof Aware) {//检查bean属于哪个Aware//如果属于,就根据规则配置进容器里if (bean instanceof EnvironmentAware) {((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware) {((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));}if (bean instanceof ResourceLoaderAware) {((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware) {((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware) bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);}}}
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
spring的IOC原理,容器管理的bean类型、bean的生命周期相关推荐
- 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题
IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...
- Java:Spring的IOC原理(大白话解释)
先行参考以下半成品文章和参考链接,待学完课程后续整理此文章 IOC和DI关系 IOC:Inversion of Control,控制反转 DI:Dependency Injection,依赖注入 关系 ...
- spring bean的作用域和生命周期
一.spring bean的作用域 五种作用域:singleton.prototype.request.session.globalSession request.session和global ses ...
- Spring从入门到入土——Bean的作用域与生命周期
Bean的作用域 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean.简单地讲,bean就是由IoC容器初始化.装配及管理的对象 类别 说明 sin ...
- Spring【Bean的作用域与生命周期】
Spring[Bean的作用域与生命周期]
- session作用域_看完这篇Bean的作用域与生命周期,问到面试官不敢问-乐字节java...
Bean的作用域与生命周期 Bean的作用域 默认情况下,我们从Spring容器中拿到的对象均是单例的,对于bean的作用域类型如下: singleton 作用域 注意: lazy-init是懒加载, ...
- @Scope注解设置创建bean的方式和生命周期
1.1.1 Scope注解创建bean的方式和生命周期 作用 Scope设置对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式. 取 ...
- bean的作用域和生命周期
一.Bean作用域 二.生命周期 其中,这个类实现各种接口重写各种方法,会按bean的声明周期按序执行: 其中,自定义的初始化和自定义销毁的方法不是实现接口重写,而是成员方法,并且在装配bean即在x ...
- Spring的IOC原理[通俗解释一下]
2019独角兽企业重金招聘Python工程师标准>>> 本文系转载,个人认为,这篇文章对IOC原理讲的比较清楚,通俗易懂,值得一看. 原文地址:http://blog.csdn.ne ...
最新文章
- 请求https错误: unable to find valid certification
- linux下使用lftp的小结
- 很慢怎么办_手机信号满格,网速却很慢怎么办?3招教你一键恢复网络
- 用Maven管理JavaScript资源
- SDN精华问答 | 为什么SDN要花这么长时间才被采用?
- MFC架构之CWinThread类
- 分享两个网址,一个是使用mssql自带的跟踪工具和分析工具
- ubuntu 20.04 美化开机动画
- Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)
- 某商场TD-LTE室内覆盖规划
- android 自动锁屏设置,如何才能使安卓手机不自动锁屏?改成自动黑屏,谢谢
- 通过root用户与hadoop用户分别启动zookeeper,两种启动结果为什么会截然不同?
- 【Unity】从零使用Amplify Shader - 超简单2D外轮廓
- linux下读取excel文件
- Piggy-Bank(背包)
- Win10+OpenCV无法正常读取USB摄像头数据解决方案
- 常用ANSI C语言标准库函数汇总(一)
- 电力行业必看,国产评估板-全志科技T3开箱测评
- 【网页制作】制作百度网盘登录页
- win10这里的以太网,不知道怎么消失了
热门文章
- Implementation of the USB 3.0 controller not found!
- 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...
- java调用FFmpeg及mencoder转换视频为FLV并截图
- Apache+PHP+Mysql+jdk+tomcat的安裝
- 如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?...
- SQL Server命令行
- Optimizing regular expressions in Java
- asp.net mvc 性能测试工具 - Glimpse
- 转载------工作10年的人总结的6句话
- TI DSP simulator 种类选择