IoC Container

什么是IOC?

通俗理解就是 POJO 原本是自己需要然后new出来,现在是IOC 容器则是 你告诉我你需要什么,我们直接给你,让别人为你服务!

现实生活:1.你出门之前需要穿衣服,之前则是需要自己找对应的衣服,现在则反转成你的妻子把这些衣服找好给你穿上。

当然为你服务的前提是知道你的需求:

?第一类似于你是酒吧常客,服务员立马知道你的需求 — 构造函数初始化 ,优点则是对象构造完成之后 对象就已经就绪可以用了?第二类似于你到酒吧大喊我需要啤酒,服务员知道你的需求 — 对象set/get 方法 对象构造完成之后也不可以立马使用,但是比较解耦,类似于我告诉对应的需求,你来服务我,而不是见到我就无脑服务我

IOC 可以很好的做到解耦,正常来说 我明确我需要什么,具体服务实现你提供给我即可。

看看spring 里的Ioc 容器:

beanFactory & ApplicationContext

IoC Container
ApplicationContext
IoC Container
Ioc container

defaultListableBeanFactory 是一个比较通用的beanFactory ,不仅实现了 beanFactory 的getBean等方法,也实现了

beanDefinitionRegistry的注册管理的功能。beanDefinitionRegistry 就像图书馆的书架一样,beanFactory 则是整个图书馆,

书架上的书则是beanDefinition 。

IoC Container
DeanDefinition

大体流程

外部配置 xml / properties –> beanDefinitionReader —>beanDefinition —> 将beanDefinition 注册到beanDefinitionRegister,完成

bean的注册和加载 ,从而进行bean的获取。

IoC Container

Ioc 容器 就是在了解你的需求之后 去满足你的需求,而不需要你自己去实现自己的需求。

spring 里的容器则是beanFactory 比较简单只有getBean ,高级一点的则有applicationContext ,里面不仅是getBean

beanFactory & factoryBean

IoC Container

容器的整个历程

?概览:

IoC Container

容器启动阶段:BeanDefinitionReader 加载解析 xml 配置信息 成beanDefinition ,并且注册到beanDefinitionRegister。

IoC Container

容器实例化阶段:getBean 尝试获取对象,如果获取不到,则根据对应注册的beanDefinition 进行实例化返回

ps:总的来说 第一阶段像装配生产线,酒吧服务知道你的需求,第二阶段则是进行真正的生产,酒吧服务员满足你的需求。

BeanFactoryPostprocessor

BeanFactoryPostprocessor 会插手容器启动阶段,可以修改已经加载的beanDefinition信息,常见的如:PropertyPlaceholderConfigurer 和 PropertyOverrideConfigurer.

?PropertyOverrideConfigurer:

IoC Container

?overrideConfig.properties: 规则 –> beanname+属性

testFactoryBeanCore.name=\\\"ckj\\\"

?结果 :

bean 的生命历程

经过第一阶段的 启动过程 之后,有了bean的 beanDefinitions,进入实例化阶段,这个阶段实在getBean 时 才进行触发。

i

beanFactoryPostprocessor & beanPostprocessor

BeanPostProcessor是存在于对象实例化阶段作用于bean,而BeanFactoryPostProcessor则是存在于容器启动阶段,作用于beanFactory 。

自定义beanPostProcessor

beanPostProcessor:

@Component
@Slf4j
public class CustomBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof TestBeanPostProcessorCore) {
            ((TestBeanPostProcessorCore) bean).setAge(100);
            ((TestBeanPostProcessorCore) bean).setName(\\\"ckj\\\");
            log.info(\\\"=== this custom bean :{}\\\", JSON.toJSONString(bean));
            return bean;
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

@Component
@Data
public class TestBeanPostProcessorCore {

    private String name;

    private Integer age;
}

运行:

2021-05-31 16:50:19.522  INFO 12652 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-05-31 16:50:19.522  INFO 12652 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1641 ms
2021-05-31 16:50:19.708  INFO 12652 --- [ main] c.c.base.spring.CustomBeanPostProcessor : === this custom bean :{\\\"age\\\":100,\\\"name\\\":\\\"ckj\\\"}

获取

原创文章,作者:小技术君,如若转载,请注明出处:https://www.sudun.com/ask/33953.html

Like (0)
小技术君的头像小技术君
Previous 2024年4月6日
Next 2024年4月6日

相关推荐

  • 云原生应用里的服务发现

    服务定义: 服务定义是声明给定服务如何被消费者/客户端使用的方式。在建立服务之间的同步通信通道之前,它会与消费者共享。 同步通信中的服务定义: 微服务可以将其服务定义发布到服务注册…

    CDN资讯 2024年4月17日
    0
  • 实现速率限制的初学者指南

    如果你之前接触过后端服务,你可能听说过速率限制(Rate Limit)这个术语。 如果没有这个关键的工具包,客户端可以在任何时间点向你的服务发起无限多的请求。这会导致突然的流量激增…

    2024年4月19日
    0
  • 关系数据库的全景图

    这篇文章讨论了关系型数据库内部的索引和事务是如何工作的,而不深入研究特定数据库的怪癖。我将涵盖您应该了解的关于RDBMS索引的一切。我将简要涉及事务和隔离级别,以及它们如何影响对特…

    CDN资讯 2024年4月7日
    0
  • CDN延迟高问题怎么解决的

    解决CDN延迟高的问题 CDN(内容分发网络)在网站加速中发挥着重要作用,但有时候用户可能会遇到CDN延迟高的问题,导致网站访问速度变慢。在本文中,我们将探讨解决CDN延迟高问题的…

    2024年3月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注