Spring两大核心---------IOC的理解(待完善)

1、Spring Ioc 是什么?

Spring Ioc称作控制反转,从容器角度来将意寓为将对象的控制权交由Spring容器,让我们无需再关注于对象的创建,只需要处理自己的业务,降低各对象之间的耦合。从应用程序角度来讲,为了实现这个控制反转,我们采用依赖注入的方式去完成,通过set注入、构造器注入、以及属性注入三种方式实现。通常情况下我们都会通过注解的方式去实现,当然也可以通过xml配置的方式去实现。

2、Bean的生命周期

提到Ioc就得提到bean,bean就是我们向Spring容器注入的实例,它和Servlet一样都有一个生命周期,这个生命周期能够提供我们在bean创建过程中进行一些拓展,这里先说结论,再说详细内容,其大致的生命周期为:
创建实例对象===》进行初始化====》销毁对象
其留给我们扩展的地方在于每个过程中都会去执行一些额外的织入方法,请看Spring 创建源码(为精简后的代码更方便理解)

调用doCreateBean 方法创建bean


    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    // 创建实例对象
        BeanWrapper instanceWrapper = this.createBeanInstance(beanName, mbd, args)// 初始化Bean
        Object exposedObject = this.initializeBean(beanName, exposedObject, mbd);
        
    }

initializeBean 初始化bean方法代码(可扩展性的重点)

    protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    // 调用aware方法,此方法主要是去判断要初始化的bean是否实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware三个接口
    // 如果有实现,则调用其对应的setXXX方法(这里XXX代表的是其类名去除Aware部分例如setBeanName方法,后续中也是的其他织入接口也这样表示)
        this.invokeAwareMethods(beanName, bean);
        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
        // 然后调用其初始化后处理器前置方法,会循环获取后置处理器集合中的所有处理器类并执行他们对应的后置处理器前置方法
        // 我们经常使用的ApplicationContextAware接口就是在此处完成,它会在ApplicationContextAwareProcessor执行的时候去判断我们bean是否实现了ApplicationContextAware接口,如果实现了则会执行对应的setXXX方法,
        // 其他的织入接口同理
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }

        try {
        // 再去执行我们的invokeInitMethods方法,在该方法中,如果我们实现了InitializingBean接口,则调用afterPropertiesSet方法
        // 再去判断我们是否配置了InitMethod(初始化方法),如果配置了则会去执行,注意如果配置的方法不存在或者方法报错了会抛异常
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, var6.getMessage(), var6);
        }
        // 再调用我们的初始化后处理器的后置方法,其原理同前置方法
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

        return wrappedBean;
    }

到这里完成了我们的创建实例对象以及初始化操作,当容器关闭时或者我们调用销毁方法时,则会进行bean销毁。

	// 首先是创建DisposableBeanAdapter销毁bean适配器,在执行其销毁方法
	/*
	** 销毁bean方法
	*/
    public void destroyBean(Object existingBean) {
        (new DisposableBeanAdapter(existingBean, this.getBeanPostProcessorCache().destructionAware)).destroy();
    }


	/*
	** 销毁bean适配器的销毁方法
	*/
    public void destroy() {
    // 在创建bean销毁适配器时会去判断当前bean是否实现了DisposableBean接口,如果实现则invokeDisposableBean = true 
    // 然后去执行我们实现了的销毁方法
        if (this.invokeDisposableBean) {
                ((DisposableBean)this.bean).destroy();
        }
        // 如果说我们实现了AutoCloseable接口并且我们的销毁方法名第一个为close,则会去执行我们实现了自动关闭的接口的关闭方法
        // 否则就会去循环调我们配置好的自定义方法(如果没有配置当然也不会执行任何方法)
        if (this.invokeAutoCloseable) {
        ((AutoCloseable)this.bean).close();
        } else {
		 .......
        }
       
    }

至此该bean的一生结束

3.三级缓存与循环依赖问题的解决

提到bean的生命周期,就离不开循环依赖问题的处理了

4.bean的作用域

Spring容器中的bean可以分为5个范围:
(1)singleton:
(2)prototype:
(3)request:
(4)session:
(5)global-session:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值