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

网站转让 备案吗如何进入网站

网站转让 备案吗,如何进入网站,杭州网站建设公司排行,网站推广 知乎简介 在spring中BeanDefinition是一个接口,下面也有很多的实现类 大致如下 BeanDefinitionAbstractBeanDefinitionRootBeanDefinition 最终每个BeanDefinition都是一个 RootBeanDefinitionChildBeanDefinition 现在不用了废弃&#xff…

简介

在spring中BeanDefinition是一个接口,下面也有很多的实现类

大致如下

BeanDefinitionAbstractBeanDefinitionRootBeanDefinition              最终每个BeanDefinition都是一个 RootBeanDefinitionChildBeanDefinition             现在不用了废弃,现在使用的都是 GenericBeanDefinitionGenericBeanDefinition           我们定义的一般都是 GenericBeanDefinitionScannedGenericBeanDefinition    是GenericBeanDefinition的一个子类,表示是通过scanner扫描出来的BeanAnnotatedGenericBeanDefinition  是GenericBeanDefinition的一个子类,表示是通过reader注册的Bean

属性

beanClass           bean对应的类,是一个object类型,在还没有实例化单例Bean的时候放入的是类全限定名,实例化后就是class
scope               单例 多例等
abstractFlag        标志无法实例化
lazyInit            懒加载
autowireMode        AUTOWIRE_NO,AUTOWIRE_BY_NAME,AUTOWIRE_BY_TYPE,AUTOWIRE_CONSTRUCTOR,AUTOWIRE_AUTODETECT
dependsOn           依赖于其它bean,其它bean会先初始化
instanceSupplier    对象来源于Supplier
factoryBeanName     factoryBean的名字
factoryMethodName   @Bean的时候会有值
initMethodName      初始化方法
destroyMethodName   销毁方法

mergedBeanDefinitions

在spring中并没有该类的定义,但却十分重要

private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);

一般来说我们的bean都是GenericBeanDefinition,其实也是RootBeanDefinition,但是在xml方式下,可以设置一个BeanDefinition为abstract的,可供其它bean继承它,从而得到自己没有定义的属性

例如

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"
><bean id="abs" scope="prototype" abstract="true"/><bean id="userBean" class="com.shura.beans.UserBean" parent="abs"/>
</beans>

使用xml方式

public class Application {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");System.out.println(context.getBean(UserBean.class));System.out.println(context.getBean(UserBean.class));System.out.println(context.getBean(UserBean.class));}
}输出
com.shura.beans.UserBean@7506e922
com.shura.beans.UserBean@4ee285c6
com.shura.beans.UserBean@621be5d1

从上面例子可以看出,定义了一个abs的抽象 BeanDefinition userBean继承了它,从而获得了多例属性

那么在注册bean的时候就势必要找出父BeanDefinition,继承属性,于是就有了mergedBeanDefinitions

在实例化单例Bean的时候就有这一步骤

方法

org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

下面是简化的源码

protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)throws BeanDefinitionStoreException {synchronized (this.mergedBeanDefinitions) {RootBeanDefinition mbd = null;RootBeanDefinition previous = null;if (containingBd == null) {mbd = this.mergedBeanDefinitions.get(beanName);}// 如果合并过就跳过if (mbd == null || mbd.stale) {previous = mbd;// 是否有parent,大部分都是进入该分支,如果进入该分支,那么本身的BeanDefinition就是RootBeanDefinitionif (bd.getParentName() == null) {if (bd instanceof RootBeanDefinition) {mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();} else {mbd = new RootBeanDefinition(bd);}} else {// 进入这里表示有父BeanDefinition parent != nullBeanDefinition pbd;try {String parentBeanName = transformedBeanName(bd.getParentName());if (!beanName.equals(parentBeanName)) {// 寻找父BeanDefinition的父BeanDefinition,知道找不到pbd = getMergedBeanDefinition(parentBeanName);} else {// 抛出异常BeanFactory parent = getParentBeanFactory();if (parent instanceof ConfigurableBeanFactory) {pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);} else {throw new NoSuchBeanDefinitionException(parentBeanName,"Parent name '" + parentBeanName + "' is equal to bean name '" + beanName +"': cannot be resolved without a ConfigurableBeanFactory parent");}}} catch (NoSuchBeanDefinitionException ex) {throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,"Could not resolve parent bean definition '" + bd.getParentName() + "'", ex);}// 覆盖属性,得到一个新的RootBeanDefinitionmbd = new RootBeanDefinition(pbd);mbd.overrideFrom(bd);}if (!StringUtils.hasLength(mbd.getScope())) {// 默认单例mbd.setScope(SCOPE_SINGLETON);}if (containingBd == null && isCacheBeanMetadata()) {// 缓存起来this.mergedBeanDefinitions.put(beanName, mbd);}}if (previous != null) {// copy属性copyRelevantMergedBeanDefinitionCaches(previous, mbd);}return mbd;}
}

上面就是merge的逻辑,大致就是,如果有父BeanDefinition就合并属性得到一个新的RootBeanDefinition,返回

本文主要介绍了BeanDefinition以及合并的过程,下一节介绍FactoryBean


欢迎关注,学习不迷路!

http://www.tj-hxxt.cn/news/35760.html

相关文章:

  • 呼和浩特市城乡建设保障局网站营销推广活动方案
  • 建筑网站起名竞价排名名词解释
  • ftp和网站后台免费十八种禁用网站
  • 大连做网站首选领超科技热门搜索排行榜
  • 网站的换肤功能怎么做中山seo关键词
  • 阿里云注销网站搜索百度下载安装
  • linux 做网站数据库线上推广宣传方式有哪些
  • 手机能用的网站免费建网站软件哪个好
  • 网站建设算固定资产吗今日新闻摘抄10条简短
  • mac版中文wordpress关于进一步优化
  • 网站被挂马原因网站设计公司模板
  • 网站的配色方案网站推广的基本方法有
  • 微信公众号开发网站开发搜索量查询百度指数
  • 汉中城乡建设网站青岛专业网站制作
  • 南宁网站开发推广代写1000字多少钱
  • 史志部门建设网站 说明河南平价的seo整站优化定制
  • 免费seo网站的工具怎么投放网络广告
  • 重庆出名的网站建设公司运城seo
  • 香港公司能在大陆做网站备案嘛软文大全
  • 阿里 做网站郑州seo推广优化
  • unity 做网站百度订单售后电话
  • wordpress居中样式网站关键词优化软件效果
  • 做网站的问卷调查设计网站官网
  • 做政府网站品牌运营中心
  • 专门做网站开发的公司宁波seo推广平台
  • 怎么做赌博网站梅州网络推广
  • 顺义做网站的厂家百度网盘手机版
  • 云浮哪有公司做网站的seo推广公司
  • 中国空间站对接成功aso投放平台
  • 沧州网站设计公司网络营销推广与策划