spring概念

本文详细阐述了Spring框架中的控制反转和依赖注入概念,包括@Autowired和@PopulationBean的作用,bean容器的运作机制,解决循环依赖的方法,以及FactoryBean与BeanFactory的区别。还介绍了Spring中涉及的设计模式,如单例、工厂模式和AOP,并揭示了AOP底层动态代理实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

控制反转:原来的对象是由使用者控制,现在交给spring来进行控制
依赖注入:将对应的属性值注入到具体对象中,@autowired、populateBean完成属性的注入(在autowireBean方法、docreateBean方法)
docreateBean
在这里插入图片描述

autowireBean在这里插入图片描述
容器:使用三层缓存,singletonObjects存放完整的对象(也是一级缓存),earlySingletonObject存放实例化后的对象(二级缓存),bean对象的创建到销毁都是容器进行管理,

  • 容器的创建过程,首先得有beanFactory(具体实现类是defaultListableBeanFactory)的创建,向bean工厂设置一些参数(BeanPostProcessor,Aware接口,这些是对bean对象进行设置的)等等属性。
  • 加载解析bean对象,准备创建bean对象的定义对象beanDefinition(xml或者注解的解析过程);
  • beanFactoryPostProcessor的处理,PlaceHolderConfigurationSupport,ConfigurationClassPostProcessor;
  • beanPostProcessor的注册功能,方便对bean对象进行具体扩展(原理是采用aop动态代理技术)
  • 通过反射技术将BeanDefinition对象实例化成具体的bean对象
  • bean对象的初始化过程(填充属性,aware子类的方法,调用BeanPostProcessor的前置方法,init-method方法,调用BeanPostProcessor后置方法)
  • 生成了完整的bean对象,通过getBean方法去调用
  • 销毁

ioc的底层实现:
1、 通过createBeanFactory创建一个bean对象工厂(DefaultListableBeanFactory,绝大部分)
2、通过注解或者xml的具体beanDefinition的实现类来读取元数据信息
3、开始循环创建对象,bean对象默认是单例的,所以优先通过getbean,doGetBean获得
3、找不到则通过createBean、doCreatebean来创建bean对象,采用的是反射的方式来创建,一般是采用无参构造的方式(具体的就是jdk中的getDeclaredConstructor和newInstance方法)

bean对象的生命周期:
1、实例化bean对象
2、调用populateBean方法进行属性的填充,调用这个方法的过程,如果有循环依赖(可以扩展)
3、调用aware接口的方法,invokeAwareMethod(完成BeanName、BeanFactory、BeanClassLoader对象的属性设置)
4、调用BeanPostProcessor的前置处理方法:使用比较多的ApplicationContextPostProcessor,是用来设置ApplicationContext、Environment、ResourceLoader等对象
5、调用initMethod方法,invokeInitMethod方法;判断是否实现了initializingBean接口,如果有调用afterPropertiesSet方法,没有就不调用
6、调用BeanPostProcessor的后置处理方法:spring的aop在此实现,AbstractAutoProxyCreator注册Destruction相关的回调接口;钩子函数
7、获取到完整的对象,可以通过getBean获得
8、销毁的过程:1、判断是否实现了DispoableBean接口 2、调用destoryMethod方法

Spring如何解决循环依赖
1、首先需要了解一下什么是循环依赖,循环依赖就是对象A的属性是对象b,对象B的属性有对象a,如此一来,创建对象就会有冲突,如果采用构造器的方式创建是有问题的,只有采用set方法来设置属性才能解决该问题。
2、实际上对象的创建过程中,经历了beanFactory创建之后读取beanDefinition定义对象,然后实力化对象,接着对对象进行初始化(线填充属性,在bean的生命周期有说过的,上去看)。
具体过程就是错误的方式:创建出对象A 属性为null,那么就需要调用populateBean从容器中寻找对象B,发现没有,那么就创建对象B,创建的过程和A类似,实例化B之后发现属性a为空,那么就去容器找,因为此时对象A只是实例化,但是没有填充好属性,所以并没有在容器中,所以在容器中找不到对象A,这样以来,A对象创建在容器中找不到B,B创建容器中找不到A,形成闭环,循环依赖出现。。
3、一张图解释解决循环依赖问题
在这里插入图片描述

4、普通对象和代理对象不可能同时出现在容器中,当一个对象需要被代理时,就会使用代理对象覆盖掉普通对象,在实际的调用过程中,无法确定啥时候对象被调用,所以必须要在对象被代理之前就判断是否需要被代理,类似一种回掉机制,因此传入lambda表达式的时候,可以通过表达式来执行对象的覆盖过程,getEarlyBeanReference
5、缓存的放置时间和删除时间
三级缓存:createBeanInstance
二级缓存:创建对象B,执行lambda表达式,从三级缓存拿出对象A时,需要暴露对象A,然后将对象A放入二级缓存,删除三级缓存
一级缓存:对象B创建完毕,返回给对象A的属性b赋值,这时对象B先放入一级缓存,对象A创建完毕之后,放入一级缓存,删除二三级缓存

Bean Factory和FactoryBean的区别
相同点:都是创建bean对象的
不同点:BeanFactory创建遵循严格的生命周期,如果要创建简单的创建,同时交给spring进行管理,那么实现FactoryBean接口就行
三个方法:isSingleton、getObjectType(获取返回对象类型)、getObject(自定义创建对象过程(new、反射、动态代理))

spring用到的设计模式
单例模式:bean默认都是单例的
原型模式
工厂模式:BeanFactory
模板方法:postProcessBeanFactory,onFresh
策略模式:XmlBeanDefinitionReader、PropertiesBeanDefinitionReader
观察者模式:listener,multicast
适配器模式:Adapter
装饰者模式
责任链模式:使用aop的时候生成一个拦截器链
代理模式:动态代理

Spring中的aop底层实现原理
动态代理实现有两种方式,一种是cglib,一种是jdk自带的
那么在spring中,实际上是beanFactory在创建bean对象之后(也就是实例化后),进行populateBean,然后实现aware接口,进行BeanPostProcess的前置方法处理,进行initMethod方法,再次调用BeanPostProcessor的后置处理方法,进行aop的功能增强
1、代理对象的创建过程(advice、切面、切点)
2、通过jdk或者cglib生成动态代理对象
3、执行方法调用时,调用生成的字节码文件,直接找到DynamicAdvisorInterceptor类中的intercept方法
4、根据之前生成好的通知生成拦截器链
5、从拦截器链中一次获取每一个通知开始执行,执行过程中,为了方便找下一个通知是谁,会有一个cglibMethodInvocation对象,找的时候从-1位置依次开始查找并执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值