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

Spring之生成Bean

Bean的生命周期:实例化->属性填充->初始化->销毁

核心入口方法:finishBeanFactoryInitialization-->preInstantiateSingletons

DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。

1.preInstantiateSingletons方法分析

作用:实例化非懒加载的bean

1.拿到所有BeanDefinitionName,遍历所有beanName

2.getMergedLocalBeanDefinition,将属性合并生成MergeBeanDefinition,如下图的属性

最终结果是:Map<beanName,RootBeanDefinition>,beanName对应合并后的BeanDefintion

如果存在父子BeanDefinition,则要合并,二合一会生成第三个BeanDefinition(新的);否则,就直接返回自己的BeanDefinition。

如果该BeanDefinition是RootBeanDefinition,就直接cloneBeanDefinition,并返回。

同时,涉及到递归合并,合并的父亲又有父亲beanDefinition,就需要多次合并。(这段源码的含义)

// 子BeanDefinition的属性覆盖父BeanDefinition的属性,这就是合并
mbd = new RootBeanDefinition(pbd);
mbd.overrideFrom(bd);

3.会判断是不是懒加载、是不是单例Bean、是不是抽象BeanDefinition,如果都不是,则进入步骤4

4.如果是FactoryBean,则开始创建FactoryBean。FactoryBean对应两个bean对象,但是只有一个beanDefinition。核心代码如下:

for (String beanName : beanNames) {// 获取合并后的BeanDefinitionRootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// isAbstract 抽象的BeanDefinition和抽象类无关if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) {// 获取FactoryBean对象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<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {// 实现了接口SmartFactoryBean,并且isEagerInit=true// 实现了接口FactoryBean,重写的getObject()方法 是在用户使用getBean的时候调用的// SmartFactoryBean可以指定在 bean创建的时候 调用getObject()方法isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {// 创建真正的Bean对象(getObject()返回的对象)getBean(beanName);}}}else {// 创建Bean对象getBean(beanName);}}
}

如果我们从单例池拿到了bean,那么就要判断是否和我们想要的bean类型一样(FactoryBean还是普通bean)。从Cache拿bean,getCachedObjectForFactoryBean(存放getObject生成的bean)

下面的代码:判断该bean是不是FactoryBean。

@Override
public boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException {String beanName = transformedBeanName(name);Object beanInstance = getSingleton(beanName, false);if (beanInstance != null) {return (beanInstance instanceof FactoryBean);}// No singleton instance found -> check bean definition.// 去父beanFactory找 是否有该beanNameif (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) {// No bean definition found in this factory -> delegate to parent.return ((ConfigurableBeanFactory) getParentBeanFactory()).isFactoryBean(name);}return isFactoryBean(beanName, getMergedLocalBeanDefinition(beanName));
}

注意:如果FactoryBean类实现了SmartFactoryBean,并且重写了isEagerInit()方法,则在bean生命周期中就会创建FactoryBean,否则在getBean的时候才会创建FactoryBean。

5.不是FactoryBean且是非懒加载的bean

调用getBean,创建Bean

6.所有的非懒加载单例Bean都创建完了后,getSingleton(beanName);拿出所有单例Bean,看其是否实现了SmartInitializingSingleton接口,如果实现了这个接口,就执行重写后的方法:afterSingletonsInstantiated。

afterSingletonsInstantiated的调用时机:所有非懒加载的bean都创建完了之后,调用它

2.getBean

首先,getBean有三种调用方式:

name, name+type(验证类型,可类型转换),name+args[](args[]用于推断构造方法)

getBean的核心方法是doGetBean

1.transformedBeanName

拿到BeanName,transformedBeanName就是去掉&符号,以及将别名转换为主名

示例1:@Bean({{"userService","userService1", "userService2"}):第一个名字是名字,后面的都是别名

示例2:&factoryBeanName是拿factoryBeanName;而factoryBeanName是拿getObject的bean。(比如UserBean)

2.getSingleton

先去单例池拿bean,拿到了就检查符不符合我们的需求(原型也走这一步)

3.拿不到,则进入else分支,创建bean

4.进入这行代码,parentBeanFactory != null && !containsBeanDefinition(beanName)

检查当前是否存在这个beanName的BeanDefinition,也要检查父BeanFactory有没有BeanDefinition,有就返回bean

5.核心开始,getMergedLocalBeanDefinition,拿到合并的BeanDefinition

6.checkMergedBeanDefinition

检查BeanDefinition是不是Abstract的,如果是,则不能创建bean(抽象的beanDefinition不能创建bean)

7.getDependsOn

处理@DepondsOn注解。检查依赖,将其挂载到该bean的依赖属性上,然后创建依赖的bean,如果创建失败,则会抛出异常。

存在一些依赖,就将依赖关系存入map(使用registerDependentBean方法),然后getBean(创建所依赖的bean,此时也会判断是否存在循环依赖的关系)

[比如类A上加了@DepondsOn("B"),则在创建A之前必须把B创建出来。如果类B也通过这种方式依赖了A,那么就产生了循环依赖,这种情况的循环依赖会直接抛出异常,无法解决!]

源码如下:

            // Guarantee initialization of beans that the current bean depends on.String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {// dependsOn表示当前beanName所依赖的,当前Bean创建之前dependsOn所依赖的Bean必须已经创建好了for (String dep : dependsOn) {// beanName是不是被dep依赖了,如果是则出现了循环依赖if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}// dep被beanName依赖了,存入dependentBeanMap中,dep为key,beanName为valueregisterDependentBean(dep, beanName);// 创建所依赖的beantry {getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}

8.判断bean是单例、原型、还是其他,然后进入不同if分支

创建单例Bean,执行Lambda表达式,创建Bean后需要放到单例池;之后还会创建factoryBean

创建原型Bean,不会将其放到单例池,仅仅是简单的创建;之后还会创建factoryBean

对于request、session、application,例如,在同一个request中,同一个BeanName拿到的是用一个Bean。主要通过这两个方法,request.getAttribute,获取bean;request.setAttribute,设置bean。SpringMVC在启动的时候,会将Scope注册到容器中,之后就可以直接拿到scope的值。

9.核心是创建单例Bean

sharedInstance = getSingleton(beanName, () -> {...})

从单例池找Bean,如果没有找到Bean,就使用Lambda表达式创建Bean。addSingleton(并添加到单例池)

核心方法:createBean

执行Lambda的核心代码:getSingleton

try {singletonObject = singletonFactory.getObject(); // 执行Lambda表达式newSingleton = true;
}

3.createBean

1.resolveBeanClass

马上就要实例化Bean了,确保beanClass被加载了

// 如果beanClass被加载了
if (mbd.hasBeanClass()) {return mbd.getBeanClass();
}// 如果beanClass没有被加载
if (System.getSecurityManager() != null) {return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>)() -> doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());
}
else {return doResolveBeanClass(mbd, typesToMatch);// 加载类
}

2.resolveBeforeInstantiation

实例化前,执行实例化前的PostProcessor。

如果bean实现了InstantiationAwareBeanPostProcessor接口,并重写了invokeAwareMethods,可以在这里直接返回Bean,终止Spring创建该Bean(可以进行人工干预来创建bean)。如果在实例化前就返回了Bean,那么他需要做初始化后的操作。(和AOP有关)

3.doCreateBean

实例化,主要流程是下面的步骤

4.createBeanInstance

实例化Bean

5.applyMergedBeanDefinitionPostProcessors

该后置处理器的执行时机:实例化后,初始化前;作用:后置处理合并后的BeanDefinition

6.解决循环依赖

7.populateBean

作用:属性填充

在里面执行实例化后的方法(postProcessAfterInstantiation),

然后执行Spring自带的属性注入(ByType和ByName),

然后执行(InstantiationAwareBeanPostProcessor中的) AutowiredAnnotationBeanPostProcessor.postProcessProperties(),处理@Autowired注解。(处理属性注入的,@Autowired注解就是通过实现这个接口实现的依赖注入)

注意:在属性赋值之前,如果程序员已经为一些属性赋值了,那么就不会再重复赋值

byName 还是 byType导致注入太灵活,只要是个set方法就会被注入,容易出问题吧。

8.initializeBean

作用:初始化Bean

核心流程:

8.1invokeAwareMethods(包含设置beanName,bean类加载器、bean工厂:setBeanName、setBeanClassLoader、setBeanFactory)

8.2执行applyBeanPostProcessorsBeforeInitialization:初始化前的PostProcessor,包含使用@PostContruct注解和实现回调接口两种方法

初始化前有很多PostProcessor,比如下面这些

8.3invokeInitMethods:判断有无实现对应接口,执行初始化操作(是否实现InitializingBean)

8.4applyBeanPostProcessorsAfterInitialization:执行初始化后PostProcessor

9.判断初始化后的bean的依赖关系有没有改变,如果有改变,则可能会报错

和AOP有关,如果AOP之后产生新的bean,但是注入给其他bean的是原来的bean,并非最终生成的bean,那么在这里就会抛出异常

10.registerDisposableBeanIfNecessary

销毁Bean,判断bean是否有bean销毁的逻辑

4.bean销毁

销毁Bean的两个核心方法:

registerDisposableBeanIfNecessary:向Adapter中设置销毁逻辑。(适配器模式)

context.close():调用Adpter的销毁逻辑。
实现Bean销毁的方法

1.实现DisposableBean接口,重写destroy方法;

2.使用PreDestroy注解

4.1.registerDisposableBeanIfNecessary

protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {// 判断是否实现了销毁的接口if (mbd.isSingleton()) {// Register a DisposableBean implementation that performs all destruction// work for the given bean: DestructionAwareBeanPostProcessors,// DisposableBean interface, custom destroy method.registerDisposableBean(beanName, new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessorCache().destructionAware, acc));}else {// A bean with a custom scope...Scope scope = this.scopes.get(mbd.getScope());if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + mbd.getScope() + "'");}scope.registerDestructionCallback(beanName, new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessorCache().destructionAware, acc));}}}

1.判断有没有指定销毁的方法

2.hasDestroyMethod

有无实现接口DisposableBean、AutoCloseable

3.hasDestructionAwareBeanPostProcessors

有没有实现DestructionAwareBeanPostProcessor,有没有重写requiresDestruction,重写了这个接口的方法,返回true,就需要销毁。

4.registerDisposableBean

把销毁逻辑存到disposableBeans,他是一个Map,Map<beanName,Adapter>。

这里用到适配器模式:new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessorCache().destructionAware, acc)

DisposableBeanAdapter中的核心方法:destroy

4.2.context.close()

/*** Close this application context, destroying all beans in its bean factory.* <p>Delegates to {@code doClose()} for the actual closing procedure.* Also removes a JVM shutdown hook, if registered, as it's not needed anymore.* @see #doClose()* @see #registerShutdownHook()*/@Overridepublic void close() {synchronized (this.startupShutdownMonitor) {doClose();// If we registered a JVM shutdown hook, we don't need it anymore now:// We've already explicitly closed the context.if (this.shutdownHook != null) {try {Runtime.getRuntime().removeShutdownHook(this.shutdownHook);}catch (IllegalStateException ex) {// ignore - VM is already shutting down}}}}

核心方法是:doClose,调用Adpter的销毁逻辑

1.publishEvent

发布关闭事件

2.this.lifecycleProcessor.onClose();

关闭Spring容器的生命周期

3.destroyBeans

销毁Bean,以下步骤都是这个方法的操作。

4.destroySingletons-->destroySingleton

从单例池中移除掉Bean,如果存在依赖关系,则也要进行相应销毁

比如,A依赖B,那么B如果需要销毁,那么先销毁A,再销毁B

在这个方法中,会调用bean.destroy(),这里就进到了Adpter的销毁逻辑

5.遍历有销毁逻辑的Bean

this.containedBeanMap.clear();
this.dependentBeanMap.clear();
this.dependenciesForBeanMap.clear();

执行clearSingletonCache,包含以下内容:

this.singletonObjects.clear(); 单例池
this.singletonFactories.clear();
this.earlySingletonObjects.clear();
this.registeredSingletons.clear();
this.singletonsCurrentlyInDestruction = false;

相关文章:

Spring之生成Bean

Bean的生命周期&#xff1a;实例化->属性填充->初始化->销毁 核心入口方法&#xff1a;finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…...

笔记整理—linux进程部分(6)进程间通信、alarm和pause

两个进程间通信可能是任何两个进程间的通信&#xff08;IPC&#xff09;。同一个进程是在同一块地址空间中的&#xff0c;在不同的函数与文件以变量进程传递&#xff0c;也可通过形参传递。2个不同进程处于不同的地址空间&#xff0c;要互相通信有难度&#xff08;内存隔离的原…...

Java网络通信—UDP

0.小记 1.udp通信不需要建立socket管道&#xff0c;一边只管发&#xff0c;一边只管收 2.客户端&#xff1a;将数据&#xff08;byte&#xff09;打包成包裹&#xff08;DatagramPacket&#xff09;&#xff0c;写上地址&#xff08;IP端口&#xff09;&#xff0c;通过快递站&…...

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理

clusterIP作为k8s中的服务&#xff0c; 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod&#xff0c;pod由控制器自动部署&#xff0c;自动维护 那么问题是service的可用…...

vue框架和uniapp框架区别

文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…...

828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)

前言 Flexus X实例内嵌智能应用调优算法&#xff0c;性能强悍&#xff0c;基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍&#xff0c;性能模式更是超越多系列旗舰型云主机&#xff0c;为企业业务提供强劲动力。 &#x1f4bc; Flexus X Zabbix&#xff1a;打造…...

JAVA基础-线程(Thread)、多线程(Multi-threaded)

1、知识铺垫 要想了解什么是线程&#xff0c;首先要搞明白线程与进程的区别&#xff0c;并行与并发的区别 1.1 线程与进程 进程&#xff1a;是指⼀个内存中运⾏的应⽤程序&#xff0c;每个进程都有⼀个独⽴的内存空间&#xff0c;⼀个应⽤程序可以同时运⾏多个进程&#xff1b…...

hystrix微服务部署

目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程&#xff08;修改一下工程的注册名字&#xff09; 2.运行登录nacos网站查看运行效果&#xff08;默认密码nacos,nacos&#xff09; 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…...

使用百度文心智能体创建多风格表情包设计助手

文章目录 一、智能定制&#xff0c;个性飞扬二、多元风格&#xff0c;创意无限 百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&…...

【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)

前面已经写了两篇博客关于智能家居的&#xff0c;服务器全都是使用ONENET中国移动&#xff0c;他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器&#xff0c;有公用的&#xff0c;也可以自己搭建 前言一、项目总览二、总体流程分析1、了解…...

css的背景background属性

CSS的background属性是一个简写属性&#xff0c;它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码&#xff0c;使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…...

Cypress自动化测试实战:构建高效的前端测试体系

在快速迭代的软件开发环境中&#xff0c;前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具&#xff0c;凭借其丰富的特性、直观的API和高效的测试执行速度&#xff0c;赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypres…...

【YOLO学习】YOLOv2详解

文章目录 1. 概述2. Better2.1 Batch Normalization&#xff08;批归一化&#xff09;2.2 High Resolution Classifier&#xff08;高分辨率分类器&#xff09;2.3 Convolutional With Anchor Boxes&#xff08;带有Anchor Boxes的卷积&#xff09;2.4 Dimension Clusters&…...

windows 录音编码为flv格式时,pcm采样格式

这里使用的是0x3e&#xff0c;转换为二进制&#xff1a; 0 0 1 1 1 1 1 0 前四个字节为3&#xff0c;表示Linear Pcm, 后4个字节1 1 1 0 表示44100HZ采样&#xff0c; 16个bit&#xff0c;单声道。 故&#xff0c;windows 音频采样不支持48000HZ频率...

Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

继续讲一些Qt开发中的技巧操作&#xff1a; 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制&#xff0c;有时候不想看到这个烦人的切换按钮&#xff0c;可以设置usesScrollButtons为假&#xff0c;其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…...

51c自动驾驶~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案&#xff01;HTCL&#xff1a;分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍&#xff0c;HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法&#xff0c;甚至在和…...

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者&#xff1a;席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑&#xff0c;从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助&#xff01; Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;定位于一个更易于构建云原…...

PHP魔幻(术)方法

PHP中的魔幻方法&#xff0c;也被称为魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;是一组具有特殊功能的方法。这些方法在PHP中有固定的名称&#xff0c;并且会在特定的时机自动被PHP调用&#xff0c;而无需开发者显式调用。它们通常用于执行一些特殊的操作&…...

VS开发 - 静态编译和动态编译的基础实践与混用

目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件&#xff08;从VS2015起&#xff09; 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库&#xff08;Runtime Library&#xff09;就是WINDOWS系统…...

Golang | Leetcode Golang题解之第451题根据字符出现频率排序

题目&#xff1a; 题解&#xff1a; func frequencySort(s string) string {cnt : map[byte]int{}maxFreq : 0for i : range s {cnt[s[i]]maxFreq max(maxFreq, cnt[s[i]])}buckets : make([][]byte, maxFreq1)for ch, c : range cnt {buckets[c] append(buckets[c], ch)}an…...

零信任如何增强网络物理系统 (CPS) 安全性

远程访问对于管理关键基础设施至关重要&#xff0c;因为它允许企业优化和扩展运营并保持效率。然而&#xff0c;它也带来了许多安全漏洞&#xff0c;而且随着连接设备数量的增加&#xff0c;这些漏洞只会越来越多。 到 2025 年&#xff0c;企业和消费者环境中的物联网设备数量…...

V3D——从单一图像生成 3D 物体

导言 论文地址&#xff1a;https://arxiv.org/abs/2403.06738 源码地址&#xff1a;https://github.com/heheyas/V3D.git 人工智能的最新进展使得自动生成 3D 内容的技术成为可能。虽然这一领域取得了重大进展&#xff0c;但目前的方法仍面临一些挑战。有些方法速度较慢&…...

计算机网络期末复习真题(附真题答案)

前言&#xff1a; 本文是笔者在大三学习计网时整理的笔记&#xff0c;哈理工的期末试题范围基本就在此范畴内&#xff0c;就算真题有所更改&#xff0c;也仅为很基础的更改数值&#xff0c;大多跑不出这些题&#xff0c;本文包含简答和计算等大题&#xff0c;简答的内容也可能…...

Unity 的 UI Event System 是一个重要的框架

Unity 的 UI Event System 是一个重要的框架&#xff0c;用于处理用户界面中的输入事件。以下是它的主要特点和功能&#xff1a; 1. 事件管理 UI Event System 负责捕获和管理来自用户的输入事件&#xff0c;如鼠标点击、触摸、键盘输入等。 2. 事件传播 事件通过层次结…...

第十三章 集合

一、集合的概念 集合&#xff1a;将若干用途、性质相同或相近的“数据”组合而成的一个整体 Java集合中只能保存引用类型的数据&#xff0c;不能保存基本类型数据 数组的缺点&#xff1a;长度不可变 Java中常用集合&#xff1a; 1.Set(集):集合中的对象不按特定方式排序&a…...

子非线程池中物

线程池&#xff0c;又好上了 有任务队列 任务要处理就直接放到里面 预先创建好线程&#xff0c;本质上也是一个生产消费模型 线程池真是麻烦啊 我们可以直接沿用之前写过的代码&#xff0c;Thread.hpp: #pragma once #include <iostream> #include <functional&…...

Unraid的cache使用btrfs或zfs?

Unraid的cache使用btrfs或zfs&#xff1f; 背景&#xff1a;由于在unraid中添加了多个docker和虚拟机&#xff0c;因此会一直访问硬盘。然而&#xff0c;单个硬盘实在难以让人放心。在阵列盘中&#xff0c;可以通过添加校验盘进行数据保护&#xff0c;在cache中无法使用xfs格式…...

微服务实战——平台属性

平台属性 中间表复杂业务 /*** 获取分类规格参数&#xff08;模糊查询&#xff09;** param params* param catelogId* param type type"base"时查询基础属性&#xff0c;type"sale"时查询销售属性* return*/ Override public PageUtils listByCatelogId…...

半监督学习与数据增强(论文复现)

半监督学习与数据增强&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 半监督学习与数据增强&#xff08;论文复现&#xff09;概述算法原理核心逻辑效果演示使用方式 概述 本文复现论文提出的半监督学习方法&#xff0c;半监督学习&…...

css3-----2D转换、动画

2D 转换&#xff08;transform&#xff09; 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xff1a;scale 二维坐标系 2D 转换之移动 trans…...

中小企业网站建设与推广分析/外贸商城建站

前言 SQLite数据库操作在Android开发中非常常用今天我将带大家全面了解关于SQLite数据库的操作&#xff08;增、删、查、改&#xff09;目录 1. SQLite数据库介绍 SQLite是Android内置的一个小型、关系型、属于文本型的数据库。 Android提供了对 SQLite数据库的完全支持&#x…...

寻花问柳专注做一家男人最爱的网站/长沙网络营销公司排名

公众号&#xff1a;MarkerHub(关注获取更多项目资源)开发文档目录&#xff1a;本周热议本周热议&#xff0c;本周发表并且评论最多的文章排行&#xff0c;如果直接查询数据库的话很快就可以实现&#xff0c;只需要限定一下文章创建时间&#xff0c;然后更加评论数量倒叙取前几篇…...

重庆妇科医院排名前十/百度seo提高排名费用

Firefox - 附加软件 - Firebug - DOM文档结构视图 - “冻结”被AJAX不断更新的DOM视图 当页面中包含定期执行的AJAX脚本时&#xff0c;DOM视图将自动刷新&#xff0c;不便于查看&#xff0c;此时可以在script视图中AJAX脚本处设置断点&#xff0c;这样DOM视图就被“冻结”了。…...

正规的网站优化推广公司/广告网站建设网站排名优化

Hadoop生态圈 一般来说&#xff0c;狭义的Hadoop仅代表了Common、HDFS、YARN和MapReduce模块。但是开源世界的创造力是无穷的&#xff0c;围绕Hadoop有越来越多的软件蓬勃出现&#xff0c;方兴未艾&#xff0c;构成了一个生机勃勃的Hadoop生态圈。在特定场景下&#xff0c;Hado…...

阳泉哪里做网站/免费发布信息网站大全

『 头条 』比特币和标普 500 指数的相关性处于 10 个月低点加密分析公司 Santiment 在推特表示&#xff0c;比特币和标普 500 指数之间的相关性处于 10 个月低点&#xff0c;这对比特币而言可能是一个乐观因素&#xff0c;因为比特币和标普 500 指数的相关性非常适合用来识别比…...

如何找到能够建设网站的人/西安疫情最新消息

最近非常忙&#xff0c;所以没坚持看书。这样下去这本书怕是又要专门的时间收尾了&#xff0c;今天午睡醒的早&#xff0c;三四节才有课就快速得把基本概念过一下。其实这些类似背景现状的东西&#xff0c;平时大抵是不看的&#xff0c;但因为IMS对我而言是个全新的概念&#x…...