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的生命周期相关推荐

  1. 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题

    IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...

  2. Java:Spring的IOC原理(大白话解释)

    先行参考以下半成品文章和参考链接,待学完课程后续整理此文章 IOC和DI关系 IOC:Inversion of Control,控制反转 DI:Dependency Injection,依赖注入 关系 ...

  3. spring bean的作用域和生命周期

    一.spring bean的作用域 五种作用域:singleton.prototype.request.session.globalSession request.session和global ses ...

  4. Spring从入门到入土——Bean的作用域与生命周期

    Bean的作用域 ​ 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean.简单地讲,bean就是由IoC容器初始化.装配及管理的对象 类别 说明 sin ...

  5. Spring【Bean的作用域与生命周期】

    Spring[Bean的作用域与生命周期]

  6. session作用域_看完这篇Bean的作用域与生命周期,问到面试官不敢问-乐字节java...

    Bean的作用域与生命周期 Bean的作用域 默认情况下,我们从Spring容器中拿到的对象均是单例的,对于bean的作用域类型如下: singleton 作用域 注意: lazy-init是懒加载, ...

  7. @Scope注解设置创建bean的方式和生命周期

    1.1.1            Scope注解创建bean的方式和生命周期 作用 Scope设置对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式. 取 ...

  8. bean的作用域和生命周期

    一.Bean作用域 二.生命周期 其中,这个类实现各种接口重写各种方法,会按bean的声明周期按序执行: 其中,自定义的初始化和自定义销毁的方法不是实现接口重写,而是成员方法,并且在装配bean即在x ...

  9. Spring的IOC原理[通俗解释一下]

    2019独角兽企业重金招聘Python工程师标准>>> 本文系转载,个人认为,这篇文章对IOC原理讲的比较清楚,通俗易懂,值得一看. 原文地址:http://blog.csdn.ne ...

最新文章

  1. 请求https错误: unable to find valid certification
  2. linux下使用lftp的小结
  3. 很慢怎么办_手机信号满格,网速却很慢怎么办?3招教你一键恢复网络
  4. 用Maven管理JavaScript资源
  5. SDN精华问答 | 为什么SDN要花这么长时间才被采用?
  6. MFC架构之CWinThread类
  7. 分享两个网址,一个是使用mssql自带的跟踪工具和分析工具
  8. ubuntu 20.04 美化开机动画
  9. Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)
  10. 某商场TD-LTE室内覆盖规划
  11. android 自动锁屏设置,如何才能使安卓手机不自动锁屏?改成自动黑屏,谢谢
  12. 通过root用户与hadoop用户分别启动zookeeper,两种启动结果为什么会截然不同?
  13. 【Unity】从零使用Amplify Shader - 超简单2D外轮廓
  14. linux下读取excel文件
  15. Piggy-Bank(背包)
  16. Win10+OpenCV无法正常读取USB摄像头数据解决方案
  17. 常用ANSI C语言标准库函数汇总(一)
  18. 电力行业必看,国产评估板-全志科技T3开箱测评
  19. 【网页制作】制作百度网盘登录页
  20. win10这里的以太网,不知道怎么消失了

热门文章

  1. Implementation of the USB 3.0 controller not found!
  2. 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...
  3. java调用FFmpeg及mencoder转换视频为FLV并截图
  4. Apache+PHP+Mysql+jdk+tomcat的安裝
  5. 如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?...
  6. SQL Server命令行
  7. Optimizing regular expressions in Java
  8. asp.net mvc 性能测试工具 - Glimpse
  9. 转载------工作10年的人总结的6句话
  10. TI DSP simulator 种类选择