Spring IoC

1. Spring概述

Spring 中,它会认为 Java 类都是资源,而资源都 Bean ,容纳这些 Bean 的是 Spring 所提供的 IoC 容器,所以 Spring 种基于 Bean的编程。

2.SpringIoC概述

有如下的例子:
现实中系统的开发者是个团队,团队由许多开发者组成。现在假设你在一个电商网站负责开发工作,你熟悉商品交易流程,但是对财务却不怎么熟悉,而团队中有些成员对于财务处理分熟悉,在交易的过程中,商品交易流程需要调度财务的相关接口,才能得以实现,那么你的期望应该是:

  • 熟悉财务流程的成员开发对应的接口。

  • 接口逻辑尽量简单,内部复杂的业务并不需要自己去了解,你只要通过简单的调用 就能使用。

  • 通过简单的描述就能获取这个接口实例,且描述应该尽量简单。

财务接口对象的创建不是自己的行为,而是财务开发同事的行为 ,但是也完全达到了你的要求,而在潜意识里你会觉得对象应该由你主动创建,但是事实上这并不是你真实的需要,因为也许你对某领域并不精通,这个时候可以把创建对象的主动权转交给别人,这就是控制反转的概念。
1.主动创建对象
例如:
如果需要橙汁,那么就等于需要橙子、开水、糖,这些是原料,而搅拌机是工具。如果需要主动创造果汁,那么要对此创建对应的对象一JuiceMaker Blender。
在这里插入图片描述
在这里插入图片描述
主动创造橙汁,需要我们实现自己可能不太熟悉的工作一一如何搅拌橙汁,比如这里mix 方法,显然这不是个好的办法,而对象果汁( juice )是需要依赖于水(water )、水果( fruit)、 糖( su ar )和搅拌机( blend )去实现的,这个关系也会要求我们自己去维护。
在这里插入图片描述
现实生活中我们更加希望的是通过对饮品店的描述得到果汁,只想对结果进行描述,得到我们所需要的东西,这就是被动创建对象了。
2.被动创建对象
例如:
假设已经提供了果汁制造器( JuiceMaker2), 那么只需要对其进行描述就可以得到果汁了。假设饮品店还会给我 提供这样的 个描述( Source )
在这里插入图片描述我们并不需要去关注果汁是如何制造来的, 系统采用 XML 对这个清单进行描述:
在这里插入图片描述
这里对果汁进行了描述 接着需要选择饮品店,假设选择是贡茶:
在这里插入图片描述这里将饮品店设置为贡茶,这样就指定了贡茶为我们提供服务,而订单则引用我们前的定义:
在这里插入图片描述
在这里插入图片描述
3.SpringIoC阐述
控制反转是种通过描述(在 Java中可以是XML 或者注解)并通过第3方去产生或获取特定对象的方式。在 Spring中实现控制反转的是 IoC 容器,其实现方法是依赖注入。Spring会提供 IoC容器来管理对应的资源。
在这里插入图片描述

3. SpringIoC容器

从上面的例子中,我们知道了 Spring IoC 容器的作用,它可以容纳我们所开发的各种Bean,并且我们可以从中获取各种发布在 Spring IoC 容器里的Bean ,并且通过描述可以得到它。
1.SpringIoC容器的设计
Spring IoC 容器的设计主要是基于BeanFactory和ApplicationContext两个接口。ApplicationContext是BeanFactory 子接口之一,BeanFactory是Spring IoC 容器所定义的最底层接口,ApplicationContext 是其高级接口之一。
在这里插入图片描述
BeanFactory源码:
在这里插入图片描述
在这里插入图片描述

  • getBean 的多个方法用于获取配置给 Spring IoC 容器的 Bean 。
  • isSingleton 用于判断是否单例,如果判断为真,其意思是该 Bean 在容器中是作为一个唯一单例存在的。在默认情况下, Spring 会为 Bean 创建一个单例 ,也就是默认情况下 is Singleton 返回 true ,而 isPrototype 返回 false。
  • 关于 type 的匹配,这是一个按 Java 类型匹配的方式。
  • getAliases 方法是获取别名的方法。

ApplicationContext的子类:ClassPathXmlApplicationContext,先创建一个xml文件:
在这里插入图片描述这里定义了两个 Bean ,这样 Spring IoC 容器在初始化的时候就能找到它们,然后使用ClassPathXmlApplicationContext 容器就可以将其初始化。
在这里插入图片描述
2.SpringIoC容器的初始化和依赖注入
Bean的初始化和依赖注入在 Spring IoC 容器中是两大步骤,它是在初始化之后,才会进行依赖注入。
Bean初始化分为3步:
(1)Resource 定位,这步是 Spring IoC 容器根据开发者的配置,进行资源定位。
(2)BeanDefinition 的载入,这个过程就是 Spring 根据开发者的配置获取对应的 POJO,用以生成对应实例的过程。
(3)BeanDefinition 注册,这个步骤就相当于把之前通过 BeanDefinition 载入的 POJO往Spring IoC 容器中注册,这样就可以使得开发和测试人员都可以通过描述从中得到 SpringIoC 容器的 Bean。
做完了这3步, Bean 就在 Spring IoC 容器中得到了初始化,但是没有完成依赖注入,就是没有注入其配置的资源给 Bean ,那么它还不能完全使用。
对于依赖注入, Spring Bean还有个配置选项一一lazy-init,其含义就是是否初始化 Spring Bean。
3.Spring Bean的生命周期

Spring IoC 容器的本质目的就是为了管理 Bean。对于Bean,在容器中存在其生命周期,初始化和销毁也需要一个过程,在一些需要自定义过程中,插入代码改变行为。生命周期主要是为了了解 Spring IoC 容器初始化和销毁 Bean 的过程。
在这里插入图片描述
生命周期的步骤:

  • 如果 Bean 实现了接口 BeanNameAware 的setBeanName 方法,那么它就会调用这个方法
  • 如果 Bean 实现了接口 BeanFactoryAware的 setBeanFactory 方法,那么它就会调用这个方法
  • 如果Bean实现了接口 App licationContextAware 的setApplicationContext 方法,且Spring IoC 容器也必须 ApplicationContext 接口的实现类,那么才会调用这个方法,否则是不调用的
  • 如果 Bean 实现了接口 BeanPostProcessor 的postProcessBeforelnitialization 方法,那么它就会调用这个方法
  • 如 Bean 实现了接口 BeanFactory 的PostProcessorerProperti sSet方法,那么它就会调用这个方法。
  • 如 Bean 自定义了初始化方法,它就会调用己定义的初始化方法。
  • 如 Bean 实现了接口 BeanPostProcessor的 postProcessAfterlnitialization 方法,完成了这些调用,这个时候 Bean 就完成了初始化,那么 Bean 就生存在 Spring IoC容器中了,使用者就可以从中获取 Bean 的服务。

所有的SpringIoC容器最低要求是实现BeanFactory接口,若采用非ApplicationContext子类创建SpringIoc容器,则即使实现ApplicationContextAware的setApplicationContext方法,也不会在生命周期被调用。
BeanPostProcessor接口是针对所有Bean,接口DisposableBean这是针对SpringIoC容器,当一个Bean实现上述接口,只需在SpringIoC容器中定义,容器会自动识别。
BeanPostProcessor的实现类:
在这里插入图片描述
在这里插入图片描述
定义一个DisposableBean接口的实现类,是一个针对SpringIoC容器销毁的:
在这里插入图片描述
测试生命周期:
在这里插入图片描述
在这里插入图片描述
测试SpringBean生命周期:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值