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

第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇

Spring源码阅读目录

第一部分——IOC篇

第一章 Spring之最熟悉的陌生人——IOC
第二章 Spring之假如让你来写IOC容器——加载资源篇
第三章 Spring之假如让你来写IOC容器——解析配置文件篇
第四章 Spring之假如让你来写IOC容器——XML配置文件篇
第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean
第六章 Spring之假如让你来写IOC容器——Scope和属性填充
第七章 Spring之假如让你来写IOC容器——属性填充特别篇:SpEL表达式
第八章 Spring之假如让你来写IOC容器——拓展篇
第九章 Spring之源码阅读——环境搭建篇
第十章 Spring之源码阅读——IOC篇

第二部分——AOP篇

第十一章 Spring之不太熟的熟人——AOP
第十二章 Spring之不得不了解的内容——概念篇
第十三章 Spring之假如让你来写AOP——AOP联盟篇
第十四章 Spring之假如让你来写AOP——雏形篇
第十五章 Spring之假如让你来写AOP——Joinpoint(连接点)篇
第十六章 Spring之假如让你来写AOP——Pointcut(切点)篇
第十七章 Spring之假如让你来写AOP——Advice(通知)上篇
第十八章 Spring之假如让你来写AOP——Advice(通知)下篇
第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计
第二十章 Spring之假如让你来写AOP——Aspect(切面)篇
第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇
第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇
第二十三章 Spring之假如让你来写AOP——融入IOC容器篇
第二十四章 Spring之源码阅读——AOP篇


文章目录

  • Spring源码阅读目录
    • 第一部分——IOC篇
    • 第二部分——AOP篇
  • 前言
  • 尝试动手写IOC容器
      • 第二十二版 Target Object(目标对象)
  • 总结


前言

    对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
在这里插入图片描述

    所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》


    书接上回,在上篇 第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇 中,A君 已经完成了 Weaver(织入器) 部分,整个 AOP 也进入了尾声啦。接下来看看 A君 会有什么骚操作吧

尝试动手写IOC容器

    出场人物:A君(苦逼的开发)、老大(项目经理)

    背景:老大要求A君在一周内开发个简单的 IOC容器

    前情提要: A君 已经完成了 Weaver(织入器) 部分,整个 AOP 也进入了尾声 。。。

第二十二版 Target Object(目标对象)

    “A君 呐,折腾了这么久,总算快完事了。AOP 还差最后一部分内容了。你对 Target Object(目标对象) 理解似乎不够,直接用 Object 来代表目标对象,你忘了件事,之前在做 IOC容器 的时候,可是存在 作用域(Scope) 的,也就是说 Target Object(目标对象) 可以是单例,也可以是多例。再往广的说:也有可能是对象池,亦或是 ThreadLocal,甚至于用户自定义,你直接用 Object 显然满足不了这么多的需求。拿回去改改吧!”

    “果然!老大 不是好糊弄的” 虽然 A君 早有心理准备,心里还是不免一阵感叹

    感叹归感叹,活还是少不了的。不过类似的话,A君 在写 IOC容器 时,都快听腻了,面向接口编程,懂!懂!懂!A君 提取一个 TargetSource 接口,作为所有 Target Object(目标对象) 的标准,代码如下:

/*** 切面目标对象接口*/
public interface TargetSource {/*** 获取目标对象class对象** @return*/Class<?> getTargetClass();/*** 是否是静态对象* 什么是静态对象?* 单例这种可以算静态** @return*/boolean isStatic();/*** 获取目标对象** @return* @throws Exception*/Object getTarget() throws Exception;/*** 释放对象* 用于对象池之类的实现时,才有用** @param target* @throws Exception*/void releaseTarget(Object target) throws Exception;
}

好了,接口有了。接下来就是考虑具体实现的问题了。对于单例对象没什么好说的,直接定义一个 final 修饰的属性即可,问题在于多例上面,先易后难吧。A君 定义个 SingletonTargetSource 类。代码如下:

import com.hqd.ch03.v22.aop.TargetSource;
import lombok.AllArgsConstructor;/*** 单例 targetSource*/
@AllArgsConstructor
public class SingletonTargetSource implements TargetSource {private final Object target;@Overridepublic Class<?> getTargetClass() {return this.target.getClass();}@Overridepublic boolean isStatic() {return true;}@Overridepublic Object getTarget() {return target;}@Overridepublic void releaseTarget(Object target) throws Exception {}/*** @param other* @return*/@Overridepublic boolean equals(Object other) {if (other instanceof SingletonTargetSource) {return ((SingletonTargetSource) other).target.equals(this);}return false;}@Overridepublic int hashCode() {return target.hashCode();}
}

单例弄完之后,现在轮到多例了,多例细说的话,也可以分为很多种:对象池、Scope、ThreadLocal等。经过前段时间的洗礼,A君 几乎形成条件反射了,一旦涉及到多个实现,首先想到的就是能否定义抽象类,提取公共代码。“要说到公共部分,那就是 Target Object(目标对象) 应该都是从 IOC容器 中获取。” A君 心想。于是,A君 先把这部分内容提取成一个抽象类,AbstractBeanFactoryBasedTargetSource 代码如下:

import com.hqd.ch03.v22.aop.TargetSource;
import com.hqd.ch03.v22.aware.BeanFactoryAware;
import com.hqd.ch03.v22.factory.BeanFactory;public abstract class AbstractBeanFactoryBasedTargetSource implements BeanFactoryAware, TargetSource {private final String targetBeanName;private BeanFactory beanFactory;private volatile Class<?> targetClass;public AbstractBeanFactoryBasedTargetSource(String targetBeanName) {this.targetBeanName = targetBeanName;}@Overridepublic Class<?> getTargetClass() {try {if (this.targetClass != null) {return this.targetClass;}synchronized (this) {this.targetClass = this.beanFactory.getType(targetBeanName);/*获取失败,这创建对象获取*/if (this.targetClass == null) {Object bean = this.beanFactory.getBean(targetBeanName);if (bean != null) {this.targetClass = bean.getClass();}}}} catch (Exception e) {throw new RuntimeException(e);}return this.targetClass;}@Overridepublic boolean isStatic() {return false;}public BeanFactory getBeanFactory() {return beanFactory;}@Overridepublic void setBeanFactory(BeanFactory beanFactory) {if (this.targetBeanName == null) {throw new IllegalStateException("'targetBeanName' 值为空");}this.beanFactory = beanFactory;}public String getTargetBeanName() {return targetBeanName;}@Overridepublic void releaseTarget(Object target) throws Exception {}//TODO 重新equals
}

AbstractBeanFactoryBasedTargetSource 只是提供了 BeanFactory,多例的话还需要创建对象,销毁等操作,A君 在提取一个抽象类——AbstractPrototypeBasedTargetSource,代码如下:


import com.hqd.ch03.v17.aop.target.AbstractBeanFactoryBasedTargetSource;
import com.hqd.ch03.v17.factory.BeanFactory;public class AbstractPrototypeBasedTargetSource extends AbstractBeanFactoryBasedTargetSource {public AbstractPrototypeBasedTargetSource(String targetBeanName) {super(targetBeanName);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) {super.setBeanFactory(beanFactory);try {/*** 不是多例抛出异常*/if (!beanFactory.isPrototype(getTargetBeanName())) {throw new RuntimeException("bean不是多例");}} catch (Exception e) {throw new RuntimeException(e);}}/*** 创建对象** @return*/protected Object newPrototypeInstance() {return this.getBeanFactory().getBean(getTargetBeanName());}protected void destroyPrototypeInstance(Object target) {//TODO 销毁对象}
}

公共代码都提取完毕了,多例也就没有多少代码了。只需要调用父类实现即可,PrototypeTargetSource 代码如下:

public class PrototypeTargetSource extends AbstractPrototypeBasedTargetSource {public PrototypeTargetSource(String targetBeanName) {super(targetBeanName);}@Overridepublic Object getTarget() {return newPrototypeInstance();}@Overridepublic void releaseTarget(Object target) throws Exception {destroyPrototypeInstance(target);}
}

TargetSource 实现类都准备完毕了,还需要对 AdvisedSupport 进行一番改造,将Object替换成 TargetSource 即可,代码如下:

在这里插入图片描述

还有一个改造点在 CglibAopProxy,需要根据是否单例来创建不同的方法拦截器。如果非单例的话,每次都需要获取

在这里插入图片描述

DynamicUnadvisedExposedInterceptor 代码如下:

   private static class DynamicUnadvisedExposedInterceptor implements MethodInterceptor, Serializable {private final TargetSource targetSource;public DynamicUnadvisedExposedInterceptor(TargetSource targetSource) {this.targetSource = targetSource;}@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {Object oldProxy = null;Object target = this.targetSource.getTarget();try {oldProxy = AopContext.setCurrentProxy(proxy);Object retVal = invokeMethod(target, method, args, methodProxy);return processReturnType(proxy, target, method, retVal);} finally {AopContext.setCurrentProxy(oldProxy);if (target != null) {this.targetSource.releaseTarget(target);}}}}

    接下来又到了愉快的测试环节,不过,在编写测试时,A君 发现了一个问题:按理说,Target Object(目标对象) 应该是根据Scope来创建不同的实现类,单例就创建 SingletonTargetSource,多例就创建 PrototypeTargetSource。后续和 IOC容器 整合,创建Bean时候应该返回代理对象,那么代理对象和目标对象的Scope是一样的, Target Object(目标对象) 处境似乎有点尴尬了,如果目标对象是单例,那么 Target Object(目标对象) 可以是 SingletonTargetSource,目标对象是多例, Target Object(目标对象) 也可以是 SingletonTargetSource,因为代理对象和目标对象的Scope是一致的,那么是 SingletonTargetSource 还是 PrototypeTargetSource 意义不大。如此说来,只有一种情况才能解释这个设计,那就是目标对象是多例,而代理对象是单例

    “算了,不想了,回头问下 老大。” A君 放弃了,继续开始它的测试之旅,其实也没得测试,现在还没有和 IOC 结合,只能看下是否是使用 TargetSource 即可,测试代码如下:

 @Testpublic void v17() throws Throwable {System.out.println("############# 第十七版  Target Object(目标对象) #############");AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut("execution(* *.test(..))");Object ap = new AopBean();Method method = AopBean.class.getDeclaredMethod("test");AopTest aop = new AopTest();Method beforeTest = aop.getClass().getDeclaredMethod("beforeTest");Method afterTest = aop.getClass().getDeclaredMethod("afterTest");Method afterReturnTest = aop.getClass().getDeclaredMethod("afterReturnTest");List<MethodInterceptor> list = new ArrayList<>();//前置通知AspectJMethodBeforeAdvice aspectJMethodBeforeAdvice = new AspectJMethodBeforeAdvice(pointcut, beforeTest, aop);MethodBeforeAdviceInterceptor methodBeforeAdviceInterceptor = new MethodBeforeAdviceInterceptor(aspectJMethodBeforeAdvice);list.add(methodBeforeAdviceInterceptor);//后置通知list.add(new AspectJAfterAdvice(pointcut, afterTest, aop));//返回通知AspectJAfterReturningAdvice aspectJAfterReturningAdvice = new AspectJAfterReturningAdvice(pointcut, afterReturnTest, aop);list.add(new AfterReturningAdviceInterceptor(aspectJAfterReturningAdvice));ProxyFactory proxyFactory = new ProxyFactory(AopBean.class, ap, method);proxyFactory.addAdvisors(list);AopBean proxy = (AopBean) proxyFactory.getProxy();proxy.test();System.out.println(proxyFactory.getTargetSource().getClass());}

测试结果如下:

在这里插入图片描述

“OK,今天的任务完成了” A君 欢呼

小插曲: 下班前,A君 终于逮到了 老大,把自己的疑问说了出来,老大 回答道:“其实 Spring 除了 ProxyFactory,还有 ProxyFactoryBean 不仅能把代理工厂融入到 IOC,还能把代理的细节都交给开发,包括你提到的 TargetObject,只是 Spring 默认使用 ProxyFactory,屏蔽了这些东西,就是 ProxyFactory 也有 TargetSourceCreator 可以配置自定义创建 TargetSource


总结

    正所谓树欲静而风不止,欲知后事如何,请看下回分解(✪ω✪)

相关文章:

第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

探索设计模式:原型模式

设计模式之原型模式 &#x1f9d0;1. 概念&#x1f3af;2. 原型模式的作用&#x1f4e6;3. 实现1. 定义原型接口2. 定义具体的原型类3. 定义客户端4. 结果 &#x1f4f0; 4. 应用场景&#x1f50d;5. 深拷贝和浅拷贝 在面向对象编程中&#xff0c;设计模式是一种通用的解决方案…...

NLP论文速读(EMNLP 2023)|工具增强的思维链推理

论文速读|ChatCoT: Tool-Augmented Chain-of-Thought Reasoning on Chat-based Large Language Models 论文信息&#xff1a; 简介&#xff1a; 本文背景是关于大型语言模型&#xff08;LLMs&#xff09;在复杂推理任务中的表现。尽管LLMs在多种评估基准测试中取得了优异的成绩…...

JVM垃圾回收详解.②

空间分配担保 空间分配担保是为了确保在 Minor GC 之前老年代本身还有容纳新生代所有对象的剩余空间。 《深入理解 Java 虚拟机》第三章对于空间分配担保的描述如下&#xff1a; JDK 6 Update 24 之前&#xff0c;在发生 Minor GC 之前&#xff0c;虚拟机必须先检查老年代最大…...

什么是事务,事务有什么特性?

事务的四大特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09; 解释&#xff1a;原子性确保事务中的所有操作要么全部完成&#xff0c;要么全部不做。这意味着事务是一个不可分割的工作单元。在数据库中&#xff0c;这通常通过将事务的操作序列作为一个…...

深入解析:如何使用 PyTorch 的 SummaryWriter 进行深度学习训练数据的详细记录与可视化

深入解析&#xff1a;如何使用 PyTorch 的 SummaryWriter 进行深度学习训练数据的详细记录与可视化 为了更全面和详细地解释如何使用 PyTorch 的 SummaryWriter 进行模型训练数据的记录和可视化&#xff0c;我们可以从以下几个方面深入探讨&#xff1a; 初始化 SummaryWriter…...

企业微信中设置回调接口url以及验证 spring boot项目实现

官方文档&#xff1a; 接收消息与事件&#xff1a; 加密解密文档&#xff1a;加解密库下载与返回码 - 文档 - 企业微信开发者中心 下载java样例 加解密库下载与返回码 - 文档 - 企业微信开发者中心 将解压开的代码 ‘将文件夹&#xff1a;qq\weixin\mp\aes的代码作为工具拷…...

电脑超频是什么意思?超频的好处和坏处

嗨&#xff0c;亲爱的小伙伴&#xff01;你是否曾经听说过电脑超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 今天&#xff0c;我将带你揭开超频的神秘面纱&#xff0c;…...

在 AMD GPU 上构建深度学习推荐模型

Deep Learning Recommendation Models on AMD GPUs — ROCm Blogs 2024 年 6 月 28 日 发布者 Phillip Dang 在这篇博客中&#xff0c;我们将演示如何在支持 ROCm 的 AMD GPU 上使用 PyTorch 构建一个简单的深度学习推荐模型 (DLRM)。 简介 DLRM 位于推荐系统和深度学习的交汇…...

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的&#xff0c;只需要在站点里就可以配置好&#xff0c;但是云虚拟主机在管理的时候是没有这个权限的&#xff0c;只提供了简单的域名管理等信息。 此处记录下阿里云&#xff08;原万网&#xff09;的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…...

Python运算符列表

运算符 描述 xy&#xff0c;x—y 加、减,“"号可重载为连接符 x*y,x*&#xff0a;y&#xff0c;x/y,x&#xff05;y 相乘、求平方、相除、求余&#xff0c;“*”号可重载为重复&#xff0c;“&#xff05;"号可重载为格式化 <&#xff0c;<&#xff0c;&…...

MFC图形函数学习09——画多边形函数

这里所说的多边形是指在同一平面中由多条边构成的封闭图形&#xff0c;强调封闭二字&#xff0c;否则无法进行颜色填充&#xff0c;多边形包括凸多边形和凹多边形。 一、绘制多边形函数 原型&#xff1a;BOOL Polygon(LPPOINT lpPoints,int nCount); 参数&#x…...

GaussianDreamer: Fast Generation from Text to 3D Gaussians——点云论文阅读(11)

此内容是论文总结&#xff0c;重点看思路&#xff01;&#xff01; 文章概述 本文提出了一种快速从文本生成3D资产的新方法&#xff0c;通过结合3D高斯点表示、3D扩散模型和2D扩散模型的优势&#xff0c;实现了高效生成。该方法利用3D扩散模型生成初始几何&#xff0c;通过噪声…...

k8s篇之控制器类型以及各自的适用场景

1. k8s中控制器介绍 在 Kubernetes 中,控制器(Controller)是集群中用于管理资源的关键组件。 它们的核心作用是确保集群中的资源状态符合用户的期望,并在需要时自动进行调整。 Kubernetes 提供了多种不同类型的控制器,每种控制器都有其独特的功能和应用场景。 2. 常见的…...

Node.js 笔记(一):express路由

代码 建立app.js文件&#xff0c;代码如下&#xff1a; const express require(express) const app express() const port 3002app.get(/,(req,res)>{res.send(hello world!)})app.listen(port,()>{console.log(sever is running on http://localhost:${port}) })问…...

bash笔记

0 $0 是脚本的名称&#xff0c;$# 是传入的参数数量&#xff0c;$1 是第一个参数&#xff0c;$BOOK_ID 是变量BOOK_ID的内容 1 -echo用于在命令窗口输出信息 -$()&#xff1a;是命令替换的语法。$(...) 会执行括号内的命令&#xff0c;并将其输出捕获为一个字符串&#xff…...

mongoDB副本集搭建-docker

MongoDB副本集搭建-docker 注&#xff1a;在进行副本集搭建前&#xff0c;请先将服务部署docker环境并正常运行。 #通过--platform指定下载镜像的系统架构 在这我用的是mongo:4.0.28版本 arm64系统架构的mongo镜像 docker pull --platformlinux/arm64 mongo:4.0.2#查看镜像是…...

Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能

Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能 引言 在现代 web 开发中,RESTful API 已成为应用程序之间进行通信的标准方式。Python 提供了多种框架来帮助开发者快速搭建 RESTful API 服务,其中 Flask 和 FastAPI 是最受欢迎的两个框架。本…...

CentOS操作系统下安装Nacos

CentOS下安装Nacos 前言 这在Centos下安装配置Nacos 下载Linux版Nacos 首先到Nacos的 Github页面&#xff0c;找到所需要安装的版本 也可以右键复制到链接&#xff0c;然后通过wget命令进行下载 wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-ser…...

C++设计模式之适配器模式与桥接模式,装饰器模式及代理模式相似点与不同点

适配器模式、桥接模式、装饰器模式和代理模式在形式上有一些相似之处&#xff0c;因为它们都涉及到对类的功能或接口的修改、增强或转换。然而&#xff0c;它们在动机和目的上有着显著的不同。以下是对这些模式相似点和不同点的清晰说明&#xff1a; 相似点&#xff1a; 结构…...

ThreadLocal 和 Caffeine 缓存是两种不同的缓存机制,它们在用途和实现上有明显的区别

ThreadLocal 和 Caffeine 缓存是两种不同的缓存机制&#xff0c;它们在用途和实现上有明显的区别&#xff1a; ThreadLocal 缓存&#xff1a; ThreadLocal 提供了线程局部变量的功能&#xff0c;每个线程可以访问自己的局部变量&#xff0c;而不会与其他线程冲突。ThreadLocal …...

Django实现智能问答助手-进一步完善

扩展 增加问答数据库&#xff0c;通过 Django Admin 添加问题和答案。实现更复杂的问答逻辑&#xff0c;比如使用自然语言处理&#xff08;NLP&#xff09;库。使用前端框架&#xff08;如 Bootstrap&#xff09;增强用户界面 1.注册模型到 Django Admin&#xff08;admin.py…...

【Linux】开发工具make/Makefile、进度条小程序

Linux 1.make/Makefile1.什么是make和Makefile&#xff1f;2.stat命令3.Makefile单个文件的写法4.Makefile多个文件的写法 2.进度条1.回车\r、换行\n2.缓冲区3.进度条1.倒计时程序2.进度条程序 1.make/Makefile 1.什么是make和Makefile&#xff1f; 一个工程中的源文件不计其…...

深度学习三大框架对比与实战:PyTorch、TensorFlow 和 Keras 全面解析

深度学习框架的对比与实践 引言 在当今深度学习领域&#xff0c;PyTorch、TensorFlow 和 Keras 是三大主流框架。它们各具特色&#xff0c;分别满足从研究到工业部署的多种需求。本文将通过清晰的对比和代码实例&#xff0c;帮助你了解这些框架的核心特点以及实际应用。 1. 深…...

Leetcode206.反转链表(HOT100)

链接&#xff1a; 我的代码&#xff1a; class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* p head;ListNode*res new ListNode(-1);while(p){ListNode*k res->next;res->next p;p p->next;res->next->next k;}return res->…...

怎么做好白盒测试?

白盒测试 一、什么是白盒测试&#xff1f;二、白盒测试特点三、白盒测试的设计方法1、逻辑覆盖法1、测试设计方法—语句覆盖a、用例设计如下&#xff1a;b、语句覆盖的局限性 2、测试设计方法—判定覆盖a、测试用例如下&#xff1a;b、判定覆盖的局限性 3、测试设计方法—条件覆…...

【神经网络基础】

神经网络基础 1.损失函数1.损失函数的概念2.分类任务损失函数-多分类损失:3.分类任务损失函数-二分类损失:4.回归任务损失函数计算-MAE损失5.回归任务损失函数-MSE损失6.回归任务损失函数-Smooth L1损失 2.网络优化方法1.梯度下降算法2.反向传播算法(BP算法)3.梯度下降优化方法…...

实战 | C#中使用YoloV8和OpenCvSharp实现目标检测 (步骤 + 源码)

导 读 本文主要介绍在C#中使用YoloV8实现目标检测,并给详细步骤和代码。 详细步骤 【1】环境和依赖项。 需先安装VS2022最新版,.NetFramework8.0,然后新建项目,nuget安装 YoloSharp,YoloSharp介绍: https://github.com/dme-compunet/YoloSharp 最新版6.0.1,本文…...

debian 如何进入root

debian root默认密码, 在Debian系统中&#xff0c;安装完成后&#xff0c;默认情况下root账户是没有密码的。 你可以通过以下步骤来设置或更改root密码&#xff1a; 1.打开终端。 2.输入 sudo passwd root 命令。 3.当提示输入新的root密码时&#xff0c;输入你想要的密码…...

短视频矩阵系统:智能批量剪辑、账号管理新纪元!

在当今快节奏的数字化时代&#xff0c;短视频已经成为人们获取信息和娱乐的主要途径。 然而&#xff0c;对于创作者和企业来说&#xff0c;如何高效地管理多个短视频账号并保持内容的质量和一致性&#xff0c;成为了一个令人头疼的问题。 短视频矩阵系统就是为了解决这一难题…...

淘宝官网首页入口手机/首页关键词优化价格

速度慢有很多种情况&#xff0c;比如 DNS解析CDN&#xff08;可能用了国外的cdn&#xff0c;也会导致很慢的&#xff09;服务器IO&#xff08;阿里云的io做的不是很好&#xff0c;频繁的操作io&#xff0c;可能很慢&#xff09;数据库当然跟访问用户的网络也有关系 可以仔细排…...

微信网站如何做/网站建设报价

1、磁盘的概念、软盘和硬盘  要记住一点&#xff0c;我们用电脑处理的信息都是保存在磁盘里的。那您知道在磁盘上的什么地方吗&#xff1f;要想搞清楚这个问题&#xff0c;我们得从头说起。计算机的存储器有两类&#xff0c;一类是内部存储器&#xff0c;一断电就会把记住的东…...

wordpress增加内链/网页设计首页制作

EditText继承关系&#xff1a;View-->TextView-->EditTextEditText的属性很多&#xff0c;这里介绍几个&#xff1a;android:hint"请输入数字&#xff01;"//设置显示在控件上的提示信息android:numeric"integer"//设置只能输入整数&#xff0c;如果…...

网站建设公司优惠大酬宾活动/百度seo新规则

一般的类型和方法, 只能使用具体的类型: 要么是基本类型, 要么是自定义的类. 如果要编写可以应用于多种类型的代码, 这种刻板的 限制对代码的束缚就会很大 在面向对象编程中, 多态算是一种泛化机制, 你可以在方法的参数里使用基类的引用, 那么这个方法就可以使用这个基类的任…...

网站开发与网页后台开发/怎么建立公司网站

1&#xff09;事件&#xff1a;用户对程序的某一种功能性操作。 Java中的事件主要有两种&#xff1a; 1&#xff0e;组件类事件 componentEvent、ContainerEvent、WindowEvent、FocusEvent、PaintEvent、MouseEvent共六大类&#xff0c; 它们均是当组件的状态发生变化时…...

做门户网站用什么程序/链接平台

进入终端首先是这样的&#xff1a; 要输入cd /才能进入根目录&#xff1a; 然后即可通过ls查看文件了&#xff1a;...