首页 > 其他分享 >准备创建bean

准备创建bean

时间:2023-09-20 15:03:19浏览次数:48  
标签:处理 创建 bean 实例 处理器 准备 方法 属性

一个真正干活的函数其实是以do开头的,而我们错觉的函数,其实只是从全局的角度去做一些统筹的工作。这个规律对于createBean也不例外,那么createBean函数中做了那些准备工作。

protected Object createBean(final String beanName,final RootBeanDefinition mbd,final Object[] args) throws BeanCreationException
// 锁定class,根据设置的class属性或者根据className来解析Class
// 验证及准备覆盖的方法
// 给BeanPostProcessors一个机会返回代理来替代真正的实例
// 调用doCreateBean()方法
}

从代码中可以总结出函数完成的具体步骤及功能。

a.根据设置的class属性或者根据className来解析Class;

b.对override属性进行标记及验证。

1.处理override属性

protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException
// 获取对应类中方法名的个数
// 如果个数为1时,标记MethodOverride暂未被覆盖,避免参数类型检查的开销
}

通过以上两个函数的代码实现了之前反复提到过的,在Spring配置中存在lookup-method和replace-method两个配置功能,而这个配置的加载其实就是将配置统一存放在BeanDefinition中的methodOverrides属性中,这两个功能的实现原理其实是在bean实例化的时候,如果检测到存在methodOverrides属性,会动态地为当前bean生成代理并使用对应的拦截器为bean做增强处理。

2.实例化的前置处理

在真正调用doCreate方法创建bean的实例前使用了这样一个方法resolveBeforeInstantiation(beanName,mbd)对BeanDefinition中的属性做前置处理。

当经过前置处理后返回的结果如果不为空,那么会直接略过后续的Bean的创建而直接返回结果。这个特性判断虽然很容易被忽略,但是却起着至关重要的作用。

protected Object resolveBeforeInstantiation(String beanName,RootBeanDefinition mbd)

此方法中最吸引人的无疑是两个方法:applyBeanPostProcessBeforeInstantiation以及applyBeanPostProcessAfterInitialization。

这两个方法实现非常简单,无非是对后处理器中所有InstantionAwareBeanPostProcessor类型的后处理器进行postProcessBeforeInstantiation方法和BeanPostProcessAfterInitialization方法的调用。

a.实例化前的后处理器的应用

bean的实例化前调用,就是将AbstractBeanDefinition转换为BeanWrapper前的处理,给子类一个修改BeanDefinition的机会,也就是说当程序经过这个方法后,bean可能已经不是我们认识的bean了,而是或许称为 一个经过处理的代理bean,可能通过cglib生成的,也可以是其他技术生成的。

b.实例化后的后处理器的应用

Spring中的规则是在bean的初始化后尽可能保证将注册的后处理器的postProcessAfterInitialization方法应用到该bean中,因为如果返回的bean不为空,那么便不会再次经历普通bean的创建过程,所以只能在这里应用后处理器的postProcessAfterInitialization方法。

标签:处理,创建,bean,实例,处理器,准备,方法,属性
From: https://blog.51cto.com/u_11315052/7537250

相关文章

  • esp32-c3通过AT指令集创建SSL加密的TCP客户端
    官方文档https://docs.espressif.com/projects/esp-at/en/latest/esp32c3/Get_Started/index.html步骤fork源码创建新分支按键盘上的.进入编辑界面将如下证书换成目标服务器的证书提交返回到Action页面,等待自动编译完成下载下述文件将factory固件烧录到目标板的地......
  • bean的加载
    对于加载bean的功能,在Spring中的调用方法为:publicObjectgetBean(Stringname)throwsBeanException{ returndoGetBean(name,null,null,false)}protected<T>TdoGetBean(finalStringbeanName,finalClass<T>requireType,finalObject[]args,booleantypeCheckOn......
  • 注解解析的BeanDefinition
    配置文件解析完后,剩下的工作就是注册了,是processBeanDefinition函数中的BeanDefinitionReaderUtils.registerBeanDefinition(bdHodler,getReaderContext().getRegistry())代码的解析了。publicstaticvoidregistryBeanDefinition(BeanDefinitionHolderdefinitionHolder,BeanDefi......
  • 在 Net7.0环境下通过反射创建对象和调用方法
    一、介绍最近没事干,就用闲暇时间写点东西,也记录一下温习历程。老人说的好,好记性,不如烂笔头。时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用去网上乱找了。今天我要写一些有关反射创建类型实例和调用方法的文章,......
  • springframework中关于bean的装配方式、初始化、实例化流程
    ●bean的配置方式?○xml文件配置○bean的配置范围(scope范围)○bean的延迟加载(applicationContext是立即加载,如果需要延迟加载设置lazy-init为true,在getBean的时候才进行加载,加载实例化完了之后回存储到单例池中去,后续使用该bean直接从单例池中获取即可,本质上该bean还是单例的)......
  • django创建网站核心流程
       django创建网站核心步骤有7步。只有理清这7个步骤才能正确使用django创建网站。下面结合创建实例演示一下7个步骤。   第一步:打开dos窗口,在当前目录下创建工程myweb   第二步:进入myweb文件夹,创建网页项目firstapp   第三步:进入firstapp文件夹,创建模......
  • 使用DD命令在Linux中轻松创建ISO镜像U盘启动盘
    创建Linux系统U盘启动盘:一个简易教程当前,我正在使用Linux系统,具体是Xubuntu版本。在我采纳这个系统之前,我使用了Windows下的UltraISO软件来制作Linux的U盘启动盘。但是,你知道吗?在Linux系统中,我们只需使用一个简单的DD命令,便可以轻松制作Linux的ISO系统U盘启动盘。这样,我们可以轻......
  • openGauss学习笔记-74 openGauss 数据库管理-创建和管理视图
    openGauss学习笔记-74openGauss数据库管理-创建和管理视图74.1背景信息当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的......
  • arcgis for js4.x自定义Graphic数组创建FeatureLayer添加标注
    varpoint=[{ "geometry":{ "x":116.820688, "y":33.974053, "spatialReference":{ "wkid":4326 } }, "......
  • python使用sql批量插入数据+查看执行的语句+动态sql创建表+动态创建索引
    classTest():cursor=connection.cursor()data_to_insert=[]sql="INSERTINTOtest_t(id,name)VALUES""""(%s,%s)"""d=('1',"apple")data_to_insert.append(d)......