最新要闻
- 景区放“丑女”雕塑被指侮辱女性,官方回应
- 微信支付每月免费提现额度引热议:1.2万免费提你会用吗?
- 要大涨价还买吗?iPhone 15系列新配色曝光:新渲染图亮相
- 复旦教授谈为何中国出不了马斯克 要对失败和试错足够包容:网友吐槽
- 新型进网许可标志启用 你买的手机是正品吗?最新查询方法来了_全球观察
- 每日聚焦:药品说明书“看不清”“看不懂”? 国家药监局进行适老化改革
- 行政处罚的种类有哪些?行政处罚记录如何申请消除?
- 高考满分是多少分?高考满分状元750有几个人?
- 夏天是几月到几月?夏天冰箱调到几档最合适?
- 【天天热闻】武夷山属于福建还是江西 ?武夷山又增一张世界级名片
- 369、JackeyLove退出亚运会《英雄联盟》名单:回应原因没想到
- 成都一新能源汽车行驶中电池掉落马路 官方回应 天天微资讯
- 天天讯息:多人组团偷吃榴莲致超市损失近千元 果核扔进柜底:画面看醉 太丢人
- 全球今亮点!苹果公众号文案毁三观:女生卖掉有好感男生送的演唱会门票创业
- 【环球新视野】叫板苹果?干翻华为小米?这手机有点东西
- 汪小菲带2个孩子回北京,汪小菲与大s的判决书下来了
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
spring启动流程 (3) BeanDefinition详解 每日播报
BeanDefinition在Spring初始化阶段保存Bean的元数据信息,包括Class名称、Scope、构造方法参数、属性值等信息,本文将介绍一下BeanDefinition接口、重要的实现类,以及在Spring中的使用示例。
BeanDefinition接口
用于描述了一个Bean实例,该Bean实例具有属性、构造方法参数以及由具体实现提供的其他信息。
(资料图片仅供参考)
这是一个基础接口:主要目的是允许BeanFactoryPostProcessor获取和修改Bean实例属性和其他元数据。
封装以下信息:
- ParentName - The name of the parent definition of this bean definition.
- BeanClassName - The bean class name of this bean definition. The class name can be modified during bean factory post-processing, typically replacing the original class name with a parsed variant of it.
- Scope - Override the target scope of this bean, specifying a new scope name.
- isLazyInit - Whether this bean should be lazily initialized.
- DependsOn - The names of the beans that this bean depends on being initialized. The bean factory will guarantee that these beans get initialized first.
- AutowireCandidate - Whether this bean is a candidate for getting autowired into some other bean.
- Primary - Whether this bean is a primary autowire candidate.
- FactoryBeanName - The factory bean to use. This the name of the bean to call the specified factory method on.
- FactoryMethodName - Specify a factory method, if any. This method will be invoked with constructor arguments, or with no arguments if none are specified. The method will be invoked on the specified factory bean, if any, or otherwise as a static method on the local bean class.
- ConstructorArgumentValues - Constructor argument values for this bean.
- PropertyValues - The property values to be applied to a new instance of the bean.
- InitMethodName - The name of the initializer method.
- DestroyMethodName - The name of the destroy method.
- Role - The role hint for this BeanDefinition. The role hint provides the frameworks as well as tools an indication of the role and importance of a particular BeanDefinition.
- ResolvableType - A resolvable type for this bean definition, based on the bean class or other specific metadata.
- isSingleton - Whether this a Singleton, with a single, shared instance returned on all calls.
- isPrototype - Whether this a Prototype, with an independent instance returned for each call.
- isAbstract - Whether this bean is "abstract", that is, not meant to be instantiated.
- OriginatingBeanDefinition - The originating BeanDefinition.
AbstractBeanDefinition类
实现了BeanDefinition接口,具体的、完整的BeanDefinition基类,抽取出GenericBeanDefinition、RootBeanDefinition和ChildBeanDefinition的公共属性。
扩展的属性:
- AutowireMode - The autowire mode. This determines whether any automagical detection and setting of bean references will happen. Default is AUTOWIRE_NO which means there won"t be convention-based autowiring by name or type (however, there may still be explicit annotation-driven autowiring).
- AUTOWIRE_NO
- AUTOWIRE_BY_NAME
- AUTOWIRE_BY_TYPE
- AUTOWIRE_CONSTRUCTOR
- AUTOWIRE_AUTODETECT
RootBeanDefinition类
继承AbstractBeanDefinition类。
RootBeanDefinition表示在运行时支持BeanFactory中指定Bean的合并BeanDefinition。它可能是由多个相互继承的原始BeanDefinition创建的,通常注册为GenericBeanDefinitions。RootBeanDefinition本质上是运行时的"统一"RootBeanDefinition视图。
RootBeanDefinition也可以用于在配置阶段注册各个BeanDefinition。然而,自Spring2.5以来,以编程方式注册BeanDefinition的首选方式是GenericBeanDefinition类。GenericBeanDefinition的优势是允许动态定义父依赖项,而不是将角色硬编码为RootBeanDefinition。
扩展的属性:
- DecoratedDefinition - Target definition that is being decorated by this bean definition.
- QualifiedElement - Specify the AnnotatedElement defining qualifiers, to be used instead of the target class or factory method.
- TargetType - Specify a generics-containing target type of this bean definition, if known in advance.
- stale - Determines if the definition needs to be re-merged.
- allowCaching
- isFactoryBean
GenericBeanDefinition类
继承AbstractBeanDefinition类。
GenericBeanDefinition是用于构建标准BeanDefinition的一站式组件。与其他BeanDefinition一样,它允许指定一个类以及可选的构造方法参数和属性。另外,从父BeanDefinition派生可以通过parentName属性灵活配置。
通常,使用GenericBeanDefinition类来注册用户可见的BeanDefinition,后置处理器可能会对其进行操作,甚至可能重新配置parentName属性。如果父子关系恰好是预先确定的,请使用RootBeanDefinition和ChildBeanDefinition。
AnnotatedBeanDefinition接口
继承BeanDefinition接口。
扩展BeanDefinition接口,提供Bean的AnnotationMetadata,而不需要加载该类。
public interface AnnotatedBeanDefinition extends BeanDefinition {/** * Obtain the annotation metadata (as well as basic class metadata) * for this bean definition"s bean class. */AnnotationMetadata getMetadata();/** * Obtain metadata for this bean definition"s factory method, if any. */MethodMetadata getFactoryMethodMetadata();}
ScannedGenericBeanDefinition类
GenericBeanDefinition类的扩展,基于ASM ClassReader,实现了AnnotatedBeanDefinition接口,可以获取注解元数据。
这个类不会提前加载Bean Class。它从.class文件检索所有相关的元数据,并使用ASM ClassReader进行解析。
public class ScannedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {private final AnnotationMetadata metadata;/** * Create a new ScannedGenericBeanDefinition for the class that the * given MetadataReader describes. * @param metadataReader the MetadataReader for the scanned target class */public ScannedGenericBeanDefinition(MetadataReader metadataReader) {this.metadata = metadataReader.getAnnotationMetadata();setBeanClassName(this.metadata.getClassName());setResource(metadataReader.getResource());}@Overridepublic final AnnotationMetadata getMetadata() {return this.metadata;}@Overridepublic MethodMetadata getFactoryMethodMetadata() {return null;}}
AnnotatedGenericBeanDefinition类
GenericBeanDefinition类的扩展,实现了AnnotatedBeanDefinition接口,可以获取注解元数据。
public class AnnotatedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {private final AnnotationMetadata metadata;private MethodMetadata factoryMethodMetadata;public AnnotatedGenericBeanDefinition(Class> beanClass) {setBeanClass(beanClass);this.metadata = AnnotationMetadata.introspect(beanClass);}public AnnotatedGenericBeanDefinition(AnnotationMetadata metadata) {if (metadata instanceof StandardAnnotationMetadata) {setBeanClass(((StandardAnnotationMetadata) metadata).getIntrospectedClass());} else {setBeanClassName(metadata.getClassName());}this.metadata = metadata;}public AnnotatedGenericBeanDefinition(AnnotationMetadata metadata,MethodMetadata factoryMethodMetadata) {this(metadata);setFactoryMethodName(factoryMethodMetadata.getMethodName());this.factoryMethodMetadata = factoryMethodMetadata;}@Overridepublic final AnnotationMetadata getMetadata() {return this.metadata;}@Overridepublic final MethodMetadata getFactoryMethodMetadata() {return this.factoryMethodMetadata;}}
Spring中使用BeanDefinition示例
注册componentClasses
AnnotationConfigApplicationContext启动代码:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();applicationContext.register(ServiceConfig.class);applicationContext.refresh();
AnnotationConfigApplicationContext在启动时可以使用register方法注册@Configuration类,本小节将从这个方法入手看一个BeanDefinition的使用示例:
public void register(Class>... componentClasses) {Assert.notEmpty(componentClasses, "At least one component class must be specified");this.reader.register(componentClasses);}// reader.register(...)public void register(Class>... componentClasses) {for (Class> componentClass : componentClasses) {registerBean(componentClass);}}private void doRegisterBean(Class beanClass, String name,Class extends Annotation>[] qualifiers, Supplier supplier,BeanDefinitionCustomizer[] customizers) {// 构造方法中会解析AnnotationMetadata元数据AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);// 判断是否允许装配if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {return;}abd.setInstanceSupplier(supplier);ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);abd.setScope(scopeMetadata.getScopeName());String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));// 解析Lazy,Primary,DependsOn,Role等属性AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);if (qualifiers != null) {for (Class extends Annotation> qualifier : qualifiers) {if (Primary.class == qualifier) {abd.setPrimary(true);} else if (Lazy.class == qualifier) {abd.setLazyInit(true);} else {abd.addQualifier(new AutowireCandidateQualifier(qualifier));}}}if (customizers != null) {for (BeanDefinitionCustomizer customizer : customizers) {customizer.customize(abd);}}BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);// 处理Scope的proxyModedefinitionHolder = AnnotationConfigUtils .applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);// 注册到容器BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);}// BeanDefinitionReaderUtils.registerBeanDefinition(...)public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {// Register bean definition under primary name.String beanName = definitionHolder.getBeanName();// 将Bean注册到BeanDefinitionRegistryregistry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());// Register aliases for bean name, if any.String[] aliases = definitionHolder.getAliases();if (aliases != null) {for (String alias : aliases) {registry.registerAlias(beanName, alias);}}}
此处的registry是AnnotationConfigApplicationContext对象,registerBeanDefinition方法的实现在GenericApplicationContext类:
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {this.beanFactory.registerBeanDefinition(beanName, beanDefinition);}// beanFactory.registerBeanDefinition(...)public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {if (beanDefinition instanceof AbstractBeanDefinition) {try {((AbstractBeanDefinition) beanDefinition).validate();} catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Validation of bean definition failed", ex);}}BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);if (existingDefinition != null) {if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);}this.beanDefinitionMap.put(beanName, beanDefinition);} else {if (hasBeanCreationStarted()) {// Cannot modify startup-time collection elements anymore (for stable iteration)synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);List updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;removeManualSingletonName(beanName);}} else {// Still in startup registration phasethis.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);removeManualSingletonName(beanName);}this.frozenBeanDefinitionNames = null;}if (existingDefinition != null || containsSingleton(beanName)) {resetBeanDefinition(beanName);} else if (isConfigurationFrozen()) {clearByTypeCache();}}
@Bean注解
@Bean注解注入的Bean最终在ConfigurationClassBeanDefinitionReader的loadBeanDefinitionsForBeanMethod方法注册BeanDefinition:
private void loadBeanDefinitionsForBeanMethod(BeanMethod beanMethod) {ConfigurationClass configClass = beanMethod.getConfigurationClass();MethodMetadata metadata = beanMethod.getMetadata();String methodName = metadata.getMethodName();// Do we need to mark the bean as skipped by its condition?if (this.conditionEvaluator.shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN)) {configClass.skippedBeanMethods.add(methodName);return;}if (configClass.skippedBeanMethods.contains(methodName)) {return;}AnnotationAttributes bean = AnnotationConfigUtils.attributesFor(metadata, Bean.class);// Consider name and any aliasesList names = new ArrayList<>(Arrays.asList(bean.getStringArray("name")));String beanName = (!names.isEmpty() ? names.remove(0) : methodName);// Register aliases even when overriddenfor (String alias : names) {this.registry.registerAlias(beanName, alias);}// Has this effectively been overridden before (e.g. via XML)?if (isOverriddenByExistingDefinition(beanMethod, beanName)) {return;}// 创建ConfigurationClassBeanDefinition// 是RootBeanDefinition的子类ConfigurationClassBeanDefinition beanDef = new ConfigurationClassBeanDefinition(configClass, metadata, beanName);beanDef.setSource(this.sourceExtractor.extractSource(metadata, configClass.getResource()));if (metadata.isStatic()) {// static @Bean methodif (configClass.getMetadata() instanceof StandardAnnotationMetadata) {beanDef.setBeanClass( ((StandardAnnotationMetadata) configClass.getMetadata()).getIntrospectedClass());} else {beanDef.setBeanClassName(configClass.getMetadata().getClassName());}beanDef.setUniqueFactoryMethodName(methodName);} else {// instance @Bean methodbeanDef.setFactoryBeanName(configClass.getBeanName());beanDef.setUniqueFactoryMethodName(methodName);}if (metadata instanceof StandardMethodMetadata) {beanDef.setResolvedFactoryMethod(((StandardMethodMetadata) metadata).getIntrospectedMethod());}beanDef.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);beanDef.setAttribute(org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.SKIP_REQUIRED_CHECK_ATTRIBUTE, Boolean.TRUE);AnnotationConfigUtils.processCommonDefinitionAnnotations(beanDef, metadata);Autowire autowire = bean.getEnum("autowire");if (autowire.isAutowire()) {beanDef.setAutowireMode(autowire.value());}boolean autowireCandidate = bean.getBoolean("autowireCandidate");if (!autowireCandidate) {beanDef.setAutowireCandidate(false);}String initMethodName = bean.getString("initMethod");if (StringUtils.hasText(initMethodName)) {beanDef.setInitMethodName(initMethodName);}String destroyMethodName = bean.getString("destroyMethod");beanDef.setDestroyMethodName(destroyMethodName);// Consider scopingScopedProxyMode proxyMode = ScopedProxyMode.NO;AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(metadata, Scope.class);if (attributes != null) {beanDef.setScope(attributes.getString("value"));proxyMode = attributes.getEnum("proxyMode");if (proxyMode == ScopedProxyMode.DEFAULT) {proxyMode = ScopedProxyMode.NO;}}// Replace the original bean definition with the target one, if necessaryBeanDefinition beanDefToRegister = beanDef;if (proxyMode != ScopedProxyMode.NO) {BeanDefinitionHolder proxyDef = ScopedProxyCreator.createScopedProxy(new BeanDefinitionHolder(beanDef, beanName), this.registry,proxyMode == ScopedProxyMode.TARGET_CLASS);beanDefToRegister = new ConfigurationClassBeanDefinition((RootBeanDefinition) proxyDef.getBeanDefinition(), configClass, metadata, beanName);}this.registry.registerBeanDefinition(beanName, beanDefToRegister);}
@ComponentScan注解
支持@ComponentScan注解的最终逻辑在ClassPathScanningCandidateComponentProvider类的scanCandidateComponents方法中:
private Set scanCandidateComponents(String basePackage) {Set candidates = new LinkedHashSet<>();try {String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +resolveBasePackage(basePackage) + "/" + this.resourcePattern;Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);boolean traceEnabled = logger.isTraceEnabled();boolean debugEnabled = logger.isDebugEnabled();for (Resource resource : resources) {if (resource.isReadable()) {try {// 此处获取到的是SimpleMetadataReader对象,// 内部使用ASM解析.class文件封装AnnotationMetadata对象MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);// 判断是一个Componentif (isCandidateComponent(metadataReader)) {// 创建ScannedGenericBeanDefinition对象ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);sbd.setSource(resource);if (isCandidateComponent(sbd)) {candidates.add(sbd);}}} catch (Throwable ex) {throw new BeanDefinitionStoreException("Failed to read candidate component class: " + resource, ex);}}}} catch (IOException ex) {throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);}return candidates;}
关键词:
spring启动流程 (3) BeanDefinition详解 每日播报
【天天报资讯】前端Vue自定义精美宫格菜单按钮组件 可设置一行展示个数 可设置成九宫格 十二宫格 十五宫格
景区放“丑女”雕塑被指侮辱女性,官方回应
微信支付每月免费提现额度引热议:1.2万免费提你会用吗?
要大涨价还买吗?iPhone 15系列新配色曝光:新渲染图亮相
复旦教授谈为何中国出不了马斯克 要对失败和试错足够包容:网友吐槽
新型进网许可标志启用 你买的手机是正品吗?最新查询方法来了_全球观察
每日聚焦:药品说明书“看不清”“看不懂”? 国家药监局进行适老化改革
自学Python之路-django模板--jinja2模板引擎配置
行政处罚的种类有哪些?行政处罚记录如何申请消除?
高考满分是多少分?高考满分状元750有几个人?
夏天是几月到几月?夏天冰箱调到几档最合适?
今日精选:多家国有大行下调美元存款利率 专家称美元存款主要面临汇兑风险
环球热文:国际金融市场早知道:7月4日
【天天热闻】武夷山属于福建还是江西 ?武夷山又增一张世界级名片
369、JackeyLove退出亚运会《英雄联盟》名单:回应原因没想到
成都一新能源汽车行驶中电池掉落马路 官方回应 天天微资讯
天天讯息:多人组团偷吃榴莲致超市损失近千元 果核扔进柜底:画面看醉 太丢人
环球快看点丨读发布!设计与部署稳定的分布式系统(第2版)笔记18_基础层之联网
每日观察!遇到疯狂GC时进行判断然后重启服务的方法-GPT学习使用之三
全球今亮点!苹果公众号文案毁三观:女生卖掉有好感男生送的演唱会门票创业
【环球新视野】叫板苹果?干翻华为小米?这手机有点东西
汪小菲带2个孩子回北京,汪小菲与大s的判决书下来了
焦点热门:留给混动车的好日子 不多了
iQOO 11S明天发!渠道商直呼“太顶了”_天天日报
希捷酷狼PRO充氦硬盘上手:NAS好伴侣
12万建充电桩 轻松年入60万?我扒了扒内幕 那叫一个坑
腾势N7发布:比亚迪也来30万级的市场抢肉了!|环球新资讯
热消息:核子微探针_关于核子微探针概略
京东苹果自营店是苹果官方授权的吗(京东苹果13只能买一个吗)|全球今亮点
excel怎样设置快捷键(excel快捷键设置在哪里)|热头条
m3是什么单位?m3在电脑上怎么打出来?
笃是什么意思?笃的五笔怎么打?
得物有运费险吗?得物怎么申请退换货?
21%的韩国人支持征收“单身税” 多为50岁的中老年赞同
多家上市公司鼓励生育 初步推算 携程计划未来投入10亿元生育补贴
电影《燃冬》今日官宣定档七夕 由周冬雨与刘昊然主演
MySQL自动安装脚本分享|当前播报
比亚迪发布“天神之眼”高阶智能驾驶系统 其算法全部自研
媒体报道称一位北京地接导游在颐和园带团游览时 因中暑导致身亡
世界微动态丨石家庄市摩托车限行规定_在石家庄骑摩托车会收到什么惩罚
中南大学一校友向母校捐赠6亿元:未公布姓名!系王传福、梁稳根等人母校
乘客称起飞时机组人员联网刷视频 南航回应:已记录反馈将会处理
《独立日2》演员:“史皇”没回归所以影片失败了
Jmeter学习之五_跟踪被测试服务器的performance
当前视讯!启辰t70刹车片多久换一个_启辰t70刹车片多久换?
全新体验版Windows QQ发布下载:64位NT架构、全新UI界面
不香了!两部美国大制作影片折戟:将面临巨亏-当前讯息
小米:生产日期靠前或停产的手机可放心买 全球快看
今日报丨23长城证券CP006今日发布发行公告
用 IaC 的方式管理 EC2 实例 - 每天5分钟玩转 GPT 编程系列(1)
jar-project 代码加壳加密工具【开源】 当前讯息
“冰箱死婴”震惊韩国,韩政府对2000多名“幽灵儿童”进行普查
电影《燃冬》定档七夕:周冬雨刘昊然主演
用户晒鸿蒙4.0开发者版:安装包高达6.11GB 全球快播
观天下!新美队吐槽哈利波特没黑人朋友!好莱坞决定修改重拍了
腾势N7摒弃无框车门:120km/h噪音遥遥领先特斯拉Model Y和极氪001
30.18万起 比亚迪纯电猎跑SUV腾势N7正式上市:领先行业两代! 前沿热点
掌握嵌入式Linux编程2工具链-世界聚焦
C语言实现顺序表的基本操作
外交部:中国
天天关注:海关回应日本进口蜜瓜138元一瓣:没有的事儿
丹麦特斯拉车主在家充电6小时 赚了17美元 全球即时
每日快讯!紫光公开嵌入式多层SeDRAM内存:带宽、能效遥遥领先
特斯拉完胜 比亚迪彻底狂飙 车企半年考交卷了
热消息:安兔兔6月安卓手机性能榜出炉:vivo X90s一骑绝尘
焦点快播:别了,华夏人寿 注册资本565亿的瑞众人寿来了
Jmeter学习之四_kingbaseV8R6数据库的简单验证 环球今亮点
日本企业信心有所改善 避险日债周一买盘下降
债市日报:7月3日
今日要闻!海贼王中明哥几集被路飞打败_海贼王明哥和路飞他们打从第几集到第几集
“小米汽车”非官方最新手绘图出炉:结合AIGC 造型更科幻|快消息
【全球独家】日本开卖500元方形西瓜:并不能吃
世界新消息丨保时捷卡宴的亲弟弟来了!新款大众途锐上市 售58.78万起
售价超过30万元/吨 国内单体最大碳酸锂项目投产:减少进口依赖-天天微资讯
全球快资讯:英国首推水葬:沸水煮遗体4小时 比火葬更环保对遗体更温和
北京一旅行社导游热射病去世
面向对象综合案例练习 天天热头条
世界热讯:记录--多行标签超出展开折叠功能
世界焦点!Linux下PAM认证详解(以centos7为例)
快递电子运单调查|半数快递面单未隐藏消费者个人信息
环球最资讯丨在地球上 我们也有了“空间站”!全球首创
“该有的一个也不能少”!理想ONE迎来OTA升级 新增任务大师等功能
1万4都拿不出来?威马汽车成失信被执行人 创始人沈晖被限高
全面超越特斯拉Model 3 广汽昊铂Hyper GT正式上市:21.99万起 报资讯
今亮点!《最终幻想16》偷盘哥后续:是个学生 证据确凿但还在嘴硬
泰尔股份:公司的激光产品及服务广泛应用于船舶制造、工程机械、钢结构等_当前消息
Linux设置字符编码 全球快播
视觉冲击力!水球图让数据一览无余_世界新消息
潼南民生村镇银行:金融助力 小葡萄“串”起致富路|今日热闻
世界今亮点!国产第三大晶圆代工厂晶合集成:持续提升55nm产能 40nm高压获重大成果
焦点!仅重500g搭载7840U!GPD新Win掌机真机现身
百事通!新卡来得很慢 老卡走得很快!AMD ROCm开发平台放弃Vega
宝马i3销量暴增 降价十万的“油改电”到底香不香 百事通
天天热推荐:墨西哥一市长连续2年与鳄鱼结婚:如此联姻当地已存在230年
渭南:纳凉晚会话交安
每日速讯:Mybatis-Plus的详细使用
天天百事通!华为扫地僧:揭秘IoT+鸿蒙帮助企业突围物联网安全问题
【新华500】新华500指数(989001)3日涨1.28% 全球热点
网红经济学家任泽平新动向!朋友圈宣称转型美妆博主,宣传话术暗藏玄机 环球热消息