最新要闻
- 【全球新视野】问界M5智驾版发布全新OTA升级 加入全新智驾领航辅助等功能
- 真世界霸主!任天堂第一方收入远超索尼、微软
- 6月北京口岸出入境人员突破88万,再创今年出入境流量新高 全球观点
- 特斯拉将采用线控转向技术 Yoke方向盘能否全面普及? 环球要闻
- 20万买“小奔驰”图什么?
- 卷疯了!全新马自达3昂克赛拉正式上市 9.99万到底值不值?_观点
- 中非经贸博览会指定用车,岚图梦想家到底哪里好? 焦点热议
- AMD食言了!说好的显卡性能神技HYPR-RX跳票
- 至高优惠200元 华为MatePad Air 原野绿新色上市开启预售 天天快资讯
- 新机蓄势待发!Switch后续机型开发套件或已抵达西班牙-环球观热点
- 汪小菲“趁火打劫”成功,将接子女回北京,大s妥协原因引热议_全球热头条
- 大V吐槽极氪倒车影像“骗人”bug:让他撞了两次车
- 马斯克缺钱?推特限制用户浏览量:不开会员每天只能看1000条_今日视点
- 动态:硕士被曝制作全校学生颜值打分网站供人查看 人大回应
- 当前关注:excel图表制作折线图数据选择_excel图表制作折线图
- 华为智选车将建汽车独立门店 知情人士:经销商加盟 华为话语权更大
广告
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
spring启动流程 (2) Bean实例化流程 世界短讯
(相关资料图)
本文通过阅读Spring源码,分析Bean实例化流程。
Bean实例化入口
上一篇文章已经介绍,Bean实例化入口在AbstractApplicationContext类的finishBeanFactoryInitialization方法:
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.// 实例化BeanbeanFactory.preInstantiateSingletons();}
Bean实例化流程
public void preInstantiateSingletons() throws BeansException {// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.List beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// 判断非抽象,单例且非懒加载if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 判断FactoryBeanif (isFactoryBean(beanName)) {// 使用"&beanName"格式作为beanName去创建Bean实例Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {FactoryBean> factory = (FactoryBean>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction) ((SmartFactoryBean>) factory)::isEagerInit,getAccessControlContext());} else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}} else {// 普通的BeangetBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...// 此分支暂时不做分析for (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction
getBean(beanName)方法
public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}protected T doGetBean(String name, Class requiredType, Object[] args, boolean typeCheckOnly)throws BeansException {// 去除name的&前缀String beanName = transformedBeanName(name);Object bean;// 依次从singletonObjects, earlySingletonObjects, singletonFactories获取单例Bean// 如果找到了就不需要创建了Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {// Get the object for the given bean instance,// either the bean instance itself or its created object in case of a FactoryBean.// name参数是调用getBean方法时传递的原始BeanName,可能前缀&符用于获取FactoryBean实例// beanName参数是去除&符前缀后的BeanNamebean = getObjectForBeanInstance(sharedInstance, name, beanName, null);} else {// Fail if we"re already creating this bean instance:// We"re assumably within a circular reference.if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// 如果当前BeanFactory没有指定Bean则从父级BeanFactory获取Bean实例BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);} else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);} else if (requiredType != null) {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);} else {return (T) parentBeanFactory.getBean(nameToLookup);}}// whether the instance is obtained for a type check, not for actual useif (!typeCheckOnly) {markBeanAsCreated(beanName);}try {RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// 创建DependsOn的BeanString[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {// 判断循环依赖if (isDependent(beanName, dep)) {throw new BeanCreationException( mbd.getResourceDescription(), beanName, "循环依赖");}registerDependentBean(dep, beanName);try {getBean(dep);} catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException( mbd.getResourceDescription(), beanName, "依赖的Bean不存在", ex);}}}// 此分支获取单例Beanif (mbd.isSingleton()) {sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);} catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);} else if (mbd.isPrototype()) {// 此分支获取Prototype类型的BeanObject prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);} finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);} else {String scopeName = mbd.getScope();if (!StringUtils.hasLength(scopeName)) {throw new IllegalStateException("No scope name defined for bean ´" + beanName + """);}Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name");}try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);} finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);} catch (IllegalStateException ex) {throw new BeanCreationException( beanName, "Scope is not active for the current thread", ex);}}} catch (BeansException ex) {cleanupAfterBeanCreationFailure(beanName);throw ex;}}// 类型转换if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;} catch (TypeMismatchException ex) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}
创建/获取单例Bean
sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);} catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
getSingleton
返回指定beanName的(原始)单例对象,如果没有则创建一个新对象:
public Object getSingleton(String beanName, ObjectFactory> singletonFactory) {synchronized (this.singletonObjects) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {// Singleton bean creation not allowed while singletons of this factory are in destruction // (Do not request a bean from a BeanFactory in a destroy method implementation!)if (this.singletonsCurrentlyInDestruction) {throw new BeanCreationNotAllowedException(beanName, "");}beforeSingletonCreation(beanName);boolean newSingleton = false;boolean recordSuppressedExceptions = (this.suppressedExceptions == null);if (recordSuppressedExceptions) {this.suppressedExceptions = new LinkedHashSet<>();}try {// 此处需要返回去看createBean(beanName, mbd, args)的代码singletonObject = singletonFactory.getObject();newSingleton = true;} catch (IllegalStateException ex) {// Has the singleton object implicitly appeared in the meantime ->// if yes, proceed with it since the exception indicates that state.singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {throw ex;}} catch (BeanCreationException ex) {if (recordSuppressedExceptions) {for (Exception suppressedException : this.suppressedExceptions) {ex.addRelatedCause(suppressedException);}}throw ex;} finally {if (recordSuppressedExceptions) {this.suppressedExceptions = null;}afterSingletonCreation(beanName);}if (newSingleton) {// 将创建的单例放入单例池addSingleton(beanName, singletonObject);}}return singletonObject;}}protected void addSingleton(String beanName, Object singletonObject) {synchronized (this.singletonObjects) {this.singletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}
createBean
创建Bean实例、填充属性、调用后置处理器等:
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)throws BeanCreationException {RootBeanDefinition mbdToUse = mbd;// Make sure bean class is actually resolved at this point, and// clone the bean definition in case of a dynamically resolved Class// which cannot be stored in the shared merged bean definition.Class> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();} catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// 调用BeanPostProcessor处理器// 调用postProcessBeforeInstantiation方法Object bean = resolveBeforeInstantiation(beanName, mbdToUse);// 如果后置处理器返回了Bean实例则直接返回if (bean != null) {return bean;}} catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try {Object beanInstance = doCreateBean(beanName, mbdToUse, args);return beanInstance;} catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {// A previously detected exception with proper bean creation context already,// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.throw ex;} catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);}}protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {// 创建实例,使用BeanWrapper包装// 构造方法的@Autowired也在这里面实现instanceWrapper = createBeanInstance(beanName, mbd, args);}Object bean = instanceWrapper.getWrappedInstance();Class> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}// Allow post-processors to modify the merged bean definition.synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {try {// 调用MergedBeanDefinitionPostProcessor处理器applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);} catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.postProcessed = true;}}// 这里使用三级缓存封装了一段代码,解决循环依赖问题// 这段代码会执行SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法// 依赖这个Bean的其他Bean在填充属性时,调用getSingleton时会执行getEarlyBeanReference方法// 此时可以对这个Bean实例做一些事情,比如创建AOP代理// 之后会将修改之后的对象放入到二级缓存boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {// Populate the bean instance in the given BeanWrapper // with the property values from the bean definition.// 1. 调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法// 2. 依赖注入populateBean(beanName, mbd, instanceWrapper);// Initialize the given bean instance, applying factory // callbacks as well as init methods and bean post processors.// 1. invokeAwareMethods// 2. 调用BeanPostProcessor的postProcessBeforeInitialization// 3. InitializingBean的afterPropertiesSet和initMethod// 4. 调用BeanPostProcessor的postProcessAfterInitializationexposedObject = initializeBean(beanName, exposedObject, mbd);} catch (Throwable ex) {if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;} else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);}}if (earlySingletonExposure) {// 获取提前暴露的Bean实例Object earlySingletonReference = getSingleton(beanName, false);if (earlySingletonReference != null) {if (exposedObject == bean) {// 使用提前暴露的Bean替换当前BeanexposedObject = earlySingletonReference;} else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {String[] dependentBeans = getDependentBeans(beanName);Set actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);for (String dependentBean : dependentBeans) {if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {actualDependentBeans.add(dependentBean);}}if (!actualDependentBeans.isEmpty()) {throw new BeanCurrentlyInCreationException(beanName, "");}}}}// Register bean as disposable.try {registerDisposableBeanIfNecessary(beanName, bean, mbd);} catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}
创建Prototype类型的Bean
// It"s a prototype -> create a new instance.Object prototypeInstance = null;try {// 把beanName注册到ThreadLocal prototypesCurrentlyInCreation中beforePrototypeCreation(beanName);// 这里的逻辑与singleton一样了prototypeInstance = createBean(beanName, mbd, args);} finally {// 把beanName从ThreadLocal prototypesCurrentlyInCreation清除afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
关键词:
spring启动流程 (2) Bean实例化流程 世界短讯
【全球新视野】问界M5智驾版发布全新OTA升级 加入全新智驾领航辅助等功能
真世界霸主!任天堂第一方收入远超索尼、微软
6月北京口岸出入境人员突破88万,再创今年出入境流量新高 全球观点
特斯拉将采用线控转向技术 Yoke方向盘能否全面普及? 环球要闻
20万买“小奔驰”图什么?
卷疯了!全新马自达3昂克赛拉正式上市 9.99万到底值不值?_观点
中非经贸博览会指定用车,岚图梦想家到底哪里好? 焦点热议
AMD食言了!说好的显卡性能神技HYPR-RX跳票
至高优惠200元 华为MatePad Air 原野绿新色上市开启预售 天天快资讯
新机蓄势待发!Switch后续机型开发套件或已抵达西班牙-环球观热点
汪小菲“趁火打劫”成功,将接子女回北京,大s妥协原因引热议_全球热头条
大V吐槽极氪倒车影像“骗人”bug:让他撞了两次车
马斯克缺钱?推特限制用户浏览量:不开会员每天只能看1000条_今日视点
动态:硕士被曝制作全校学生颜值打分网站供人查看 人大回应
Python 使用 NetworkX
当前关注:excel图表制作折线图数据选择_excel图表制作折线图
华为智选车将建汽车独立门店 知情人士:经销商加盟 华为话语权更大
20万内仅有的换电SUV来了!吉利睿蓝7即将上市
切比雪夫距离
全球微动态丨日方首度确认!中国两栖攻击舰路过鹿儿岛
俩南方小伙山东旅游点6个菜吃不完 被北方菜“上了一课”-世界短讯
广东一电摩自燃 30辆车被连累烧成空壳!千万别在室内充电
俄罗斯恢复飞往古巴的定期航班
人大金仓学习之一_kwr的简单学习_环球看点
前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息|世界焦点
今日要闻!民主测评软件需求分析与实现
6大人争接萌娃放学 最后姥爷赢麻了:画面让网友笑翻-环球快资讯
美国一女子去世7只猫继承217万遗产引热议:上百人抢着领养
公共气象服务中心:预警“叫应”联动服务信息化建设_每日热门
每日看点!选读SQL经典实例笔记01_检索和排序
学霸、体育才女!谷爱凌大一课程全A 曾自称成绩100%自己努力得到的
华硕全球首发RTX 4060 Ti神卡:能扩展M.2 SSD
当前短讯!威马疑又停薪,仅发中高层工资!“讨债大军”攻陷官方微博
国科大校长谈龙芯之母说着说着就哭了:别让“卡脖子”遏制我们发展 当前报道
【WALT】update_window_start() 代码详解
国外RTX 4090销售陷入困境 愁坏了很多零售商
孙女给生活不能自理爷爷洗澡引争议 当事人:孝心不分男女 天天头条
升级iOS 17还要交钱?跟iOS 16对比后拔草了!立省688元
今日播报!Apple Watch新款感知不强!500块的S4最香
做“有温度”的就业指导服务|世界新视野
每日热文:大姨妈不正常怎么办吃什么好呢_大姨妈不正常怎么办
【世界速看料】茅坑里的石头是哪种人_茅坑里的石头是什么意思
【聚看点】go src - sync.Map
环球观天下!Web安全-渗透测试-权限提升01
焦点快报!116-104!山东高速力克北京首钢,山东试训外援首秀轻取19分
63岁男子向熊猫投掷苹果惹众怒 后果来了:被终身禁入
宝镇
天玑9200+性价王者预定!Redmi K60 Ultra第三方保护壳现身|全球新视野
支持正版:英国为采购Office刚花了71亿|天天快看
全球热资讯!7月新农合再涨40元,一市明确每人590元,今年你还交吗?
长城站起来!哈弗枭龙系列第1万台下线:6月热销6098台暴增97%
复兴号正式在青藏铁路投入运行:海拔3000米 零下40度也能跑
曼高德谈《夺宝奇兵5》
天天快讯:传奇设计大师去世:“我从不设计丑陋东西”
焦点精选!第一部8.0分不值一提!美国年度科幻大片续集来了
协鑫宣布年产36万吨储能正极材料项目今日投产-世界热讯
张雪峰老师推荐的十大高薪专业引发热议:计算机类霸榜 文科中仅法语入围 天天速读
丰田章男工资曝光:9.99亿日元丰田汽车史上最高! 环球微头条
RPM安装的Oracle19c 修改init.ora进行修复以及最简单开机启动Oracle的方法 世界百事通
markdown终极指南 观点
100%纯棉、亲肤舒适:布静观纯棉短袖13元、长袖16元
环球视讯!多地高温难耐 黑龙江却遭遇特大冰雹:砸碎几乎整栋楼玻璃
环球新消息丨安卓性能标杆!一加Ace 2 Pro来了:5200mAh+骁龙8 Gen2
米体:汉达可能降薪续约留在国米,下赛季担任二号门将 全球微动态
mosquitto的基本参数使用
全球热议:探究直播app源码技术:视频上传功能
当前资讯!02修剪标准&&方法
环球滚动:ThinkPHP6.0 链式SQL语句
【世界速看料】见证历史!苹果成全球首家市值3万亿美元公司 意味着什么?
男生旅行3年收集50余个城市水土:覆盖30个省份 比打卡拍照更有意义
云南男子外出干活遇超大菌子 网友羡慕:菌之大一锅炖不下_当前聚焦
网友吐槽一条街三四十个井盖 官方回应:雨污分流、将铺上沥青
当前热议!五年中考三年模拟八上物理答案
全球观热点:MinIO-对象存储简单使用
JS必学的11个工具方法(避免重复造轮子) 世界快看
IDA的使用2_全球新视野
荷兰DUV光刻机一律管制出口?一文看懂|环球快播
埃安6月销量45013辆创历史新高 今年已卖出比亚迪一个月销量
特斯拉加入价格乱战!买这两款车最高优惠4.5万元
国内高端手机市场除了苹果iPhone 还能有谁?! 焦点要闻
2023年全国铁路暑期运输启动:满血复活 暴涨超70%
焦点热议:使用Gitee或GitHub托管Maven仓库JAR包的便捷方法
灭霸演员是谁_ 芝士回答
世界短讯!心爱的小乌龟死了:主人把它做成《七龙珠》龟仙人手办!
担心的事情发生了!泰国女游客卷入电动步道腿被夹断
火车站保洁阿姨不慎弄脏乘客衣服跪地道歉 公司回应:已和解 世界观焦点
蔚来智能系统Banyan 2.0正式发布:超120项功能 号称全场景领先
天天快播:一键打开动态日历 锁定2023下半年这些大事!
本田飞度彻底无语!新款马自达昂克赛拉官降3万:8.99万起_今头条
小米下一代旗舰还用1英寸主摄!1.33英寸还得等|快报
天天头条:今天起全国汽车实施国6排放标准6b阶段!对老车年检有何影响?官方解答
Web安全-渗透测试-waf绕过02
每日快讯!微服务设计:集成
vue中封装服务器地址/接口与设置请求头
天津关于调整2023年住房公积金缴存额的通知政策解读
环球讯息:你敢吃吗?知了肉初上市400元一斤:号称高蛋白
不用求助“拍瓜师”!西瓜甜不甜:看这里就知道
QQ空间《抢车位》游戏改名了 还把特斯拉Model X名字拼错_每日快看
中国包揽全球液晶电视面板TOP5 牢牢掌控话语权 日韩份额仅剩1成-全球热闻