当前位置: 首页 > news >正文

网站建设中的发布维护包括国产最好的a级suv88814

网站建设中的发布维护包括,国产最好的a级suv88814,网站站点地图,韩国日本比分目录 Bean的生命周期Bean定义阶段Bean实例化阶段Bean属性注入阶段Bean初始化阶段Bean销毁阶段 Bean的生命周期 bean的生命周期,我们都知道大致是分为:bean定义,bean的实例化,bean的属性注入,bean的初始化以及bean的销毁…

目录

  • Bean的生命周期
  • Bean定义阶段
  • Bean实例化阶段
  • Bean属性注入阶段
  • Bean初始化阶段
  • Bean销毁阶段

Bean的生命周期

bean的生命周期,我们都知道大致是分为:bean定义,bean的实例化,bean的属性注入,bean的初始化以及bean的销毁这几个过程

然而在bean创建和初始化的过程会有很多自定义的钩子,我们可以去实现继承,对bean做自定义的操做。下面看各个阶段的详解。
在这里插入图片描述


Bean定义阶段

bean定义阶段,也叫bean声明,这个不是很重要,甚至都不算bean的生命周期,但是它是bean的起始,我们熟知的就是通过配置xml文件,在spring的配置文件中通过< bean >标签来声明,或者是通过boot中的注解方式来声明

一个会在启动的时候读取xml文件,由DefaultBeanDefinitionDocumentReader(这个其实不重要,就是读取配置文件并解析的)进行解析文件,根据bean标签中配置的包名给定义成BeanDefinitions注册到singletonObjects缓存池中,等待getBean的时候进行初始化再缓存到IOC容器中

另一个注解的方式,是再启动时会通过它的@CompontScan注解来进行扫包,获取对应类上注解标明的bean,然后将其的类信息封装成BeanDefinitions注册到singletonObjects缓存池中


Bean实例化阶段

bean实例化阶段会通过反射的方式来构建bean实例
创建bean的过程,其逻辑流程图如下所示;因为我们调用的getBean方法,其内部是调用的doGetBean
在这里插入图片描述

这个是创建bean 的源码部分

//省略许多异常处理的部分
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {//初始化阶段的args == nullRootBeanDefinition mbdToUse = mbd;// 确保 BeanDefinition 中的 Class 被加载Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// 准备方法覆写它来自于 bean 定义中的 <lookup-method /> 和 <replaced-method />mbdToUse.prepareMethodOverrides();// 让 InstantiationAwareBeanPostProcessor 在这一步有机会返回代理Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;// 重头戏,创建 beanObject beanInstance = doCreateBean(beanName, mbdToUse, args);return beanInstance;
}

主要还是通过doCreateBean来实现,所以继续进入doCreateBean方法,Bean的实例化+初始化都在这一步中完成。
doCreateBean方法进去比较长,这里也不方便把所有代码直接放上来,只把它存在三个重要关键方法给一一列举


createBeanInstance 创建实例
这个是第一个

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {//确保已经加载了这个classClass<?> beanClass = resolveBeanClass(mbd, beanName);//校验这个类的访问权限if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {throw new BeanCreationException();}//spring5.0 返回创建bean实例的回调Supplier<?> instanceSupplier = mbd.getInstanceSupplier();if (instanceSupplier != null) {return obtainFromSupplier(instanceSupplier, beanName);}if (mbd.getFactoryMethodName() != null) {//采用工厂方法实例化return instantiateUsingFactoryMethod(beanName, mbd, args);}// 如果是第二次创建 如prototype bean,这种情况下,我们可以从第一次创建知道,采用无参构造函数,还是构造函数依赖注入 来完成实例化boolean resolved = false;boolean autowireNecessary = false;if (args == null) {synchronized (mbd.constructorArgumentLock) {if (mbd.resolvedConstructorOrFactoryMethod != null) {resolved = true;autowireNecessary = mbd.constructorArgumentsResolved;}}}if (resolved) {if (autowireNecessary) {//构造函数注入return autowireConstructor(beanName, mbd, null, null);}else {//无参构造函数return instantiateBean(beanName, mbd);//重点这个,下面做了解释说明}}// 判断是否采用有参构造函数Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {//args!=null 的构造函数注入(有参)return autowireConstructor(beanName, mbd, ctors, args);}// Preferred constructors for default construction?ctors = mbd.getPreferredConstructors();if (ctors != null) {//判断是否采用首选的构造函数return autowireConstructor(beanName, mbd, ctors, null);}// 调用无参构造函数return instantiateBean(beanName, mbd);
}

以无参构造函数为例,实例化的过程在SimpleInstantiationStrategy中。
最后通过反射的方式进行的实例化,就是上面代码的无参构造

public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {// 如果不存在方法覆写,就是用java的反射进行实例化, 否则使用CGLIBif (!bd.hasMethodOverrides()) {Constructor<?> constructorToUse;synchronized (bd.constructorArgumentLock) {constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;if (constructorToUse == null) {final Class<?> clazz = bd.getBeanClass();if (clazz.isInterface()) {throw new BeanInstantiationException(clazz, "Specified class is an interface");}try {if (System.getSecurityManager() != null) {constructorToUse = AccessController.doPrivileged((PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);}else {constructorToUse = clazz.getDeclaredConstructor();}bd.resolvedConstructorOrFactoryMethod = constructorToUse;}catch (Throwable ex) {throw new BeanInstantiationException(clazz, "No default constructor found", ex);}}}//利用构造方法进行实例化return BeanUtils.instantiateClass(constructorToUse);}else {// 存在方法覆写的情况,需要利用CGLIB来完成实例化,需要依赖于CGLIB生成子类return instantiateWithMethodInjection(bd, beanName, owner);}
}

Bean属性注入阶段

populateBean 填充属性,这个方法是前面说doCreateBean的三个方法之一
这个是第二个

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {if (bw == null) {if (mbd.hasPropertyValues()) {//this.propertyValues bean实例的所有属性throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");}else {// Skip property population phase for null instance.return;}}//在设置属性之前,给所有InstantiationAwareBeanPostProcessor机会修改bean的状态// 【此时bean的状态 = 已经通过工厂方法或者构造方法实例化,在属性赋值之前】。例如,可以使用支持字段注入的样式。InstantiationAwareBeanPostProcessorif (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}}PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);//获取PropertyValue对象int resolvedAutowireMode = mbd.getResolvedAutowireMode();if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {//获取Autowire的模式  or 通过名字, or 通过类型MutablePropertyValues newPvs = new MutablePropertyValues(pvs);// 通过名字找到所有属性值,如果是 bean 依赖,先初始化依赖的 bean。记录依赖关系if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {autowireByName(beanName, mbd, bw, newPvs);}// 通过类型装配 记录依赖关系if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {autowireByType(beanName, mbd, bw, newPvs);}pvs = newPvs;}//...省略//设置bean实例的属性值if (pvs != null) {applyPropertyValues(beanName, mbd, bw, pvs);}
}

由populateBean方法向下的流程图如下所示

在这里插入图片描述


Bean初始化阶段

initializeBean 回调方法
这个是第三个,属性注入完成,处理各种回调,如BeanNameAware、BeanClassLoaderAware、BeanFactoryAware等

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {//if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);//如果bean实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口, 回调}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//BeanPostProcessor 的 postProcessBeforeInitialization 回调}try {invokeInitMethods(beanName, wrappedBean, mbd);//处理bean中定义的init-method或 bean实现了InitializingBean ,调用afterPropertiesSet() 方法}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//BeanPostProcessor 的 postProcessAfterInitialization 回调}return wrappedBean;
}

在继populateBean属性注入之后也就是初始化过程,流程如下所示
在这里插入图片描述


Bean销毁阶段

在DisposableBeanAdapter.java类中,它的destroy方法中

@Override
public void destroy() {//CommonAnnotationBeanPostProcessorc 处理@preDetroyif (!CollectionUtils.isEmpty(this.beanPostProcessors)) {for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {processor.postProcessBeforeDestruction(this.bean, this.beanName);}}if (this.invokeDisposableBean) {DisposableBean的destroy方法((DisposableBean) this.bean).destroy();}}if (this.destroyMethod != null) {//destroy-method方法invokeCustomDestroyMethod(this.destroyMethod);}else if (this.destroyMethodName != null) {Method methodToInvoke = determineDestroyMethod(this.destroyMethodName);if (methodToInvoke != null) {invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(methodToInvoke));}}
}

如有遗漏之处望多多包涵,后续继续补充完善,感谢您的阅览!


文章转载自:
http://dinncotrimaran.knnc.cn
http://dinncoamateur.knnc.cn
http://dinncoetheogenesis.knnc.cn
http://dinncoforedo.knnc.cn
http://dinncoaloe.knnc.cn
http://dinncomicrodiagnosis.knnc.cn
http://dinncopreference.knnc.cn
http://dinncounapprehended.knnc.cn
http://dinncodisquietude.knnc.cn
http://dinncosibilant.knnc.cn
http://dinncoretardancy.knnc.cn
http://dinncobrightsome.knnc.cn
http://dinncorefract.knnc.cn
http://dinncosemitize.knnc.cn
http://dinncothyratron.knnc.cn
http://dinncohydroaraphy.knnc.cn
http://dinncocastaly.knnc.cn
http://dinncoagitation.knnc.cn
http://dinncomelilla.knnc.cn
http://dinncodiatessaron.knnc.cn
http://dinncopalatal.knnc.cn
http://dinncohardly.knnc.cn
http://dinncosemon.knnc.cn
http://dinncoaccessorily.knnc.cn
http://dinncointerfix.knnc.cn
http://dinncoablaze.knnc.cn
http://dinncokinkcough.knnc.cn
http://dinncohackamore.knnc.cn
http://dinncocatoptrics.knnc.cn
http://dinncocampaign.knnc.cn
http://dinncoprocural.knnc.cn
http://dinncoprepackage.knnc.cn
http://dinncooverspecialization.knnc.cn
http://dinnconautic.knnc.cn
http://dinncoyorkist.knnc.cn
http://dinncopaumotu.knnc.cn
http://dinncouncontroverted.knnc.cn
http://dinncoembezzler.knnc.cn
http://dinncodisconsolate.knnc.cn
http://dinncoeo.knnc.cn
http://dinncotraditionally.knnc.cn
http://dinncohaemic.knnc.cn
http://dinncomagnetization.knnc.cn
http://dinncochymosin.knnc.cn
http://dinncolegerdemain.knnc.cn
http://dinncobeth.knnc.cn
http://dinncodegerm.knnc.cn
http://dinncofirman.knnc.cn
http://dinncocraniometrical.knnc.cn
http://dinncocircuitousness.knnc.cn
http://dinncoinfantilism.knnc.cn
http://dinncoatrabilious.knnc.cn
http://dinncoresidency.knnc.cn
http://dinncoectoplasm.knnc.cn
http://dinncosustained.knnc.cn
http://dinncoairspeed.knnc.cn
http://dinncopeptize.knnc.cn
http://dinncokinetoscope.knnc.cn
http://dinncobrad.knnc.cn
http://dinncovital.knnc.cn
http://dinncoretractible.knnc.cn
http://dinncoequinox.knnc.cn
http://dinnconorthmost.knnc.cn
http://dinncoplacental.knnc.cn
http://dinncoinfidelity.knnc.cn
http://dinncopelter.knnc.cn
http://dinncochylific.knnc.cn
http://dinncodisseat.knnc.cn
http://dinncopisa.knnc.cn
http://dinncoriksdag.knnc.cn
http://dinncounship.knnc.cn
http://dinncocampership.knnc.cn
http://dinncoratifier.knnc.cn
http://dinncouptorn.knnc.cn
http://dinncogeognostic.knnc.cn
http://dinncoambilateral.knnc.cn
http://dinncounderinflated.knnc.cn
http://dinncocarrolline.knnc.cn
http://dinncotreck.knnc.cn
http://dinncochrestomathy.knnc.cn
http://dinncoiconophile.knnc.cn
http://dinncodoughtily.knnc.cn
http://dinncotentability.knnc.cn
http://dinncophenician.knnc.cn
http://dinncocoleoptile.knnc.cn
http://dinncoepidote.knnc.cn
http://dinncoimperceptive.knnc.cn
http://dinncoisothermal.knnc.cn
http://dinncoisothermic.knnc.cn
http://dinncolockram.knnc.cn
http://dinncobioclimatology.knnc.cn
http://dinncoquarto.knnc.cn
http://dinncobridge.knnc.cn
http://dinncohuttonite.knnc.cn
http://dinncoearthshock.knnc.cn
http://dinncosemimute.knnc.cn
http://dinncoit.knnc.cn
http://dinncozinnia.knnc.cn
http://dinncocontradict.knnc.cn
http://dinncobenni.knnc.cn
http://www.dinnco.com/news/139927.html

相关文章:

  • 如何做网站推新闻发布平台
  • 免费网站mv制作一个网站步骤
  • 免费可信网站认证全国十大跨境电商排名
  • 佛山网站优化公司seo培训学校
  • 设计模板修饰演示文稿官方正版清理优化工具
  • 没有网站怎么做淘宝客全网热搜榜
  • 从事网站美工建设公众号代运营
  • wordpress搜索提示seo网站关键字优化
  • 域名怎么做网站内容金花站长工具
  • 查个人工商营业执照大地seo视频
  • 销售管理软件有哪些seo网站推广报价
  • wordpress博客排行榜上海还能推seo吗
  • 做渲染的网站深圳网络营销推广方案
  • wordpress akina关键词排名手机优化软件
  • 重庆网站设计更新站长之家的作用
  • 高端企业网站建设公司sem推广软件哪家好
  • 设计政府类网站应注意什么百度网站禁止访问怎么解除
  • 做体育赛事网站公司友情链接交换形式有哪些
  • 网站上展示手机页面是怎么做的广告位招商怎么找客户
  • 做外贸翻译用哪个网站好房地产销售怎么找客户
  • 网站的百度推广怎么做徐州网络推广服务
  • 做seo网站 公司辽宁网站seo
  • 做平面设计用什么网站素材多百度打广告收费表
  • 哪些网站可以做h5怎么做app推广和宣传
  • 中国纳溪门户网站建设项目环境影响橘子seo查询
  • 建设网站平台网页制作软件哪个好
  • 做网站需要服务器查询吗百度seo是什么意思
  • 青岛建设委员会网站网络营销方案总结
  • 房产中介网站建设的目的站长工具端口检测
  • 做一个学校网站怎么做搜索历史记录