自定义加载一个bean的流程

我们来先熟悉一下基本的概念
spring IOC 和AOP 两大核心功能
springIOC:控制反转,
DI:依赖注入,是springIOC的一种实现。
····我们怎样把类加载到IOC Container中并使用呢?
1、
····1)XML 2)注解方式-javaconfig
2、 加载spring上下文
1)XML方式加载---->new ClassPathXmlAppicationContext(“xml”)
2)注解方式—>new AnnotationConfigApplicationContext(config.class)
3、 getBean(“名字”);

····一个类变成一个bean最核心—>BeanFactory
spring上下文不生产bean,只是去通beanFactory去生产bean。
getBean()方法既可以获取bean也可以生产bean。
····那么什么是BeanFactory呢?
BeanFactory是spring的顶层核心接口,使用了简单工厂模式,根据传入一个唯一标识(名字)来获取bean对象,但是是在传入参数后创建还是在传入参数前创建这个要根据具体的情况定,
实质:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
BeanFactory只负责生产bean,是一个无情的生产bean的机器。
往下说,我们就需要介绍一下beanDefinition
····BeanDefinition:bean定义,spring的顶层核心接口,关于bean的生产方式在beanDefinition中,它封装了生产bean的一切原料
····例:单例、多例、懒加载等。
我们来看一下bean被加载的流程吧!!!!!
用我自己的话来简单的描述一下,
1.我们先读取配置文件,读取配置信息
2.我们在去扫描都有哪个类被加载到spring中。比如加上@Service注解等
现在我们就知道了都有哪些bean要被加载到spring中。
3我们需要把组成一个bean的条件组装起来,相当于画一个图纸,去交给工厂去生产,还要有一个存放图纸的容器。
我们来挨个步骤具体说一下奥:
步骤一:读取配置文件,spring通过BeanDefinitionReader去读取XML等配置文件,配置文件有xml,注解。他有俩下层接口去读取,一个是读取xml的XmlBeanDefinitionReader,另一个是读取注解类型配置的AnnotatedBeanDefinitionReader。
步骤二,扫描都有哪些类需要注入倒spring中,spring采用了一个BeanDefinitionScanner去读取有哪些类需要被加载到spring中。
这时我们就知道了都有哪些类需要加载到spring中,也知道了组成这些bean的条件。
封装这些条件的就是beanDefinition,他的里面有各种组成一个bean的条件,我给大家看一下他都有啥,了解一下就行:
-String: getBeanClassName: 返回当前bean definition定义的类名
-ConstructorArgumentValues: getConstructorArgumentValues:返回bean的构造函数参数
-String[]: getDependsOn:返回当前bean所依赖的其他bean的名称
-String: getFactoryBeanName: 返回factory bean的名称
-String: getFactoryMethodName: 返回工厂方法的名称
-BeanDefinition: getOriginatingBeanDefinition: 返回原始的BeanDefinition,如果不存在返回null
-String: getParentName: 返回当前bean definition的父definition的名字
-MutablePropertyValues: getPropertyValues: 返回一个用于新的bean实例上的属性值
-String: getScope: 返回当前bean的目标范围
-boolean: isAbstract: 当前bean是否是abstract,意味着不能被实例化
-boolean: isLazyInit: bean是否是延迟初始化
-boolean: isPrimary: bean是否为自动装配的主要候选bean
-boolean: isPrototype: bean是否是多实例
-boolean: isSingleton: bean是否是单例
-void: setAutowiredCandidate(boolean): 设置bean是否对其他bean是自动装配的候选bean
-void: setBeanClassName(String): 指定bean definition的类名
-void: setDependsOn(String …): 设置当前bean初始化所依赖的beans的名称
-void: setFactoryBeanName(String): 如果factory bean的名称
-void: setFactoryMethodName(String): 设置工厂的方法名
-void: setLazyInit(boolean lazyInit): 设置是否延迟初始化
-void: setParentName(String): 设置父definition的名称
-void: setPrimary(boolean): 设置是否主要的候选bean
-void: setScope(String): 设置bean的范围,如:单例,多实例

这个接口里大概是这些东西。
我们需要有一个存放这些beanDefinition的一个容器—>BeanDefinitionMap
有bean的组成条件,还有存放这些条件的容器,现在还差一个去组装这些条件的东西,BeanDefinition相当于图纸,BeanDefinitionMap相当于存放这些图纸的文件夹,那么组装这些条件的相当于一个设计师,去设计图纸的设计师,这个比喻很形象。
那么这个设计师就是BeanDefinitionRegistry:bean注册
BeanDefinitionRegistry根据读取的条件组装成BeanDefinition,然后BeanDefinition保存在BeanDefinitionMap中。
这时,我们已经有生产bean的图纸了,就可以通知beanFactory去生产你bean(通过getBean()方法)。
这个getBean方法
bean在拿到图纸生产bean时候,会经过三个步骤来生产bean
1.实例化
2.注入属性
3.初始化 initMethod destory
这三步也有很多说头,让我把我知道的告诉你们哈
在第一步实例化,spring的实例化分为两种,一个是反射,一个是工厂
反射是spring去完成,不用咱们管,就例如我们在类上加@Service注解,我们用的时候直接注入使用,不需要去管到底怎么去实例化。
工厂,这个词可能这样说有点陌生,我举个例子就明白了,通过工厂去实例由我们去控制实例的过程,更灵活,例:@Bean,通过这种方法实例化的bean就是通过工厂去实例化,我们自己控制实例化都放啥属性啥的,灵活。
第二部注入属性,这里就是传说中产生循环依赖的地方。这一步就是往bean中注入属性值,为啥会出现循环依赖呢,看一下这个图就知道了,循环依赖
循环依赖是通过三级缓存解决的。。这个之后我再发文章再说奥
第三步初始化,这一步之后就是springAop实现的地方,这个也是之后再说。
我在给大家介绍一些东西,
BeanFactoryPostProcessor:beanFactory的后置处理器,在beanFactory之后可以执行的操作,我给大家写个例子。
在这里插入图片描述
这段代码的作用就是在beanFactory生产完bean之后,我们可以通过后置拦截器获取生产好的bean,在对bean进行调整,在放回去的操作。
获取名字为user的bean,在对这个bean的一个属性进行赋值,在放回spring的过程。
BeanFactoryPostProcessor是用来修改bean的,我们平时不用,但是spring在集成第三方框架时候会大量使用这个哦。
我再介绍一个,既然可以对bean进行修改,那么就可以对bean进行重新注册,变成一个新的bean类型。
BeanDefinitionRegistryPostProcessor,一看名字就明白了,对bean进行注册然后进行后置处理。
这里还要介绍一个,既然可以对BeanFactory进行后置处理,那么在BeanFactory生产bean时候也可以进行后置处理,就是在我上面说的那三步,进行前中后处理,三步,一共进行9次处理。
BeanPostProcessor:bean的后置处理器。
aop等很多操作都是通过这个实现的。我再网上摘了一个图大家看一下。
在这里插入图片描述
之后的内容下次再说!!
最后奉上一个完整的图,我百度看到的感觉特别好
在这里插入图片描述

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值