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

Spring IoCDI(下)—DI的尾声

        我们之前学习了控制反转IoC,接下来就开始学习依赖注入DI的细节。

        依赖注入是一个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,而资源指的就是对象。我们使用 @Autowired 注解,完成依赖注入的操作。简单来说,就是把对象取出来,放到某个类的属性中。由此,依赖注入也被称之为 “对象注入”、“属性装配”,具体含义需要结合文章的上下文来理解。

        关于依赖注入,Spring也给我们提供了三种方式:

1、属性注入(Field Injection)

2、构造方法注入(Construct Injection)

3、Setter 注入(Setter Injection)

1. 属性注入

        属性注入是使用 @Autowired 实现的,将UserService 类注入到UserController类中,UserService 类代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.stereotype.Service;@Service
public class UserService {public void doService() {System.out.println("do Service...");}
}

         UserController类的实现代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController1 {//注入方法1:属性注入@Autowiredprivate UserService userService;public void sayHi() {userService.doService();System.out.println("hi, UserController");}
}

        启动类获取到UserController的doService方法,代码如下:

package com.example.zxslzw2014_8_11;import com.example.zxslzw2014_8_11.controller.UserController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
public class Zxslzw2014811Application {public static void main(String[] args) {//获取Spring上下文对象ApplicationContext context = SpringApplication.run(Zxslzw2014811Application.class, args);//从Spring上下文中获取对象UserController1 userController1 = (UserController1) context.getBean("userController1");//使用对象userController1.sayHi();}
}

        运行结果如下:

        去掉注解@Autowired,运行结果如下:

         报错信息显示空指针异常,没办法调用doService() 方法,因为userServer为空。没有加@Autowired注解,即没有注入依赖,Spring拿不到这个属性,就不会给它初始化了,那么它肯定就是一个空指针了。 

2. 构造方法注入

        构造方法注入就是在类的构造方法中实现注入,代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController1 {private UserService userService;//注入方法2:构造方法注入@Autowiredpublic UserController1(UserService userService) {this.userService = userService;}public void doController() {userService.doService();System.out.println("hi, UserController");}
}

package com.example.zxslzw2014_8_11;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController1 {private UserService userService;//注入方法2:构造方法注入public UserController1(UserService userService) {this.userService = userService;}public void doController() {userService.doService();System.out.println("hi, UserController");}
}

        运行结果如下:

 

       如果类只有一个构造方法,那么@Autowired注解可以省略;但如果类有多个构造方法,那么就需要添加上@Autowired来明确指定要使用哪个构造方法了。下面给userController1增加一个无参构造,代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController1 {//注入方法1:属性注入
//    @Autowiredprivate UserService userService;//注入方法2:构造方法注入
//    @Autowiredpublic UserController1(){}public UserController1(UserService userService) {this.userService = userService;}public void doController() {userService.doService();System.out.println("hi, UserController");}
}

        运行结果如下:

        报错显示,空指针异常,我们的类交给Spring管理,Spring内部会给我们自动创建对象,但是是通过构造函数创建的,上图我们写了两个构造函数,如果不加@Autowired注解,Spring默认使用无参构造函数,如此就不能成功创建对象了,所以这个userService也自然是空指针了。

        现在代码改一下,把无参构造函数注释掉,更新构造函数,代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController1 {//注入方法1:属性注入
//    @Autowiredprivate UserService userService;private UserComponent userComponent;//注入方法2:构造方法注入public UserController1(UserService userService) {this.userService = userService;}public UserController1(UserService userService, UserComponent userComponent) {this.userService = userService;this.userComponent = userComponent;}public void doController() {userService.doService();userComponent.doComponent();System.out.println("hi, UserController");}
}

        运行结果如下:

          报错显示,没有找到默认的构造方法,因为这里出现了两个构造方法,Spring不知道该用哪个,现在给第二个构造方法加上@Autowired注解,表示让Spring使用被注解的构造方法,运行结果如下:

        综上:
1、只有一个构造函数的情况,可以不加@Autowired

2、如果有多个构造函数,需要指定默认的构造函数(通过@Autowired指定,如果未指定,默认使用无参的构造函数)

        构造规范:如果添加构造函数,把无参构造函数显示添加(也就是把构造函数写下来,再给注释掉)

3. Setter注入

        Setter注入和属性的Setter方法实现类似,只不过在set方法的时候需要加上@Autowired注解,代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController1 {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void doController() {userService.doService();System.out.println("hi, UserController");}
}

        结果如下:

 

         同时我们把@Autowired注解去掉的话,又会出现空指针异常,原因和属性注入把@Autowired的情况一样,就是spring优先使用空参构造,结果空参构造的对象不能匹配到我们所调用的方法。

4. 三种注入的优缺点分析

4.1 属性注入

优点:
        1、简洁、使用方便。

缺点:
        1、只能用于IoC容器,如果非IoC容器则不可用,并且只有在使用的时候才会回出现NPE(空指针异常)。

         reason:如下图,可以看到,它的来源是Spring的,那么就只能用于IoC容器了。

        2、不能注入一个final修饰的属性。

        reason: final修饰的属性有个特点,必须初始化,如果我们给属性加上final,会有两种解决方案:

        方案1、提供构造函数,如图:

         如果加上构造方法,我们的属性注入就变成了构造方法注入。

        方案二: 给它初始化,new 一个对象:

         如此我们的代码就只能自己管理了,Spring不会帮我们管理,这不是ioc的思想;

 4.2 构造方法注入

        (Spring4.X推荐)

        SpringBoot和Spring的版本号对应:

Spring Boot3.X -> Spring 6

Spring Boot2.X -> Spring 4

优点:
        1、可以注入final修饰的属性。

        final修饰的属性要初始化,构造方法会进行初始化,复合它的要求。

        2、注入的对象不会被修改。

        因为构造方法在这个类创建的时候就会给它进行赋值了,不会再对它进行修改

        3、依赖对象在使用前一定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行的方法。

        在类加载的这个阶段,就会执行构造方法了,把依赖对象给初始化完成

        4、通用性好,构造方法是JDK支持的,所以更换任何框架,它都是适用的。

        因构造方法是JDK支持的,不再Spring框架也能正常的使用

缺点:
        注入多个对象时,代码会比较繁琐。

4.3 Setter注入

        (Spring3.X推荐)
优点:
        方便在类实例之后,重新对该对象进行配置或注入。

        因为Setter方法是可以被其他地方调用的,所以即使类已经被实例化了,也可以重新对该对象进行配置或注入。

缺点:
        1、不能注入一个final修饰的属性。

        因为可能会被多次修改,所以不能使用final修饰。

        2、注入对象可能会被改变,因为Setter方法可能会被多次调用,就有被修改的风险。

        Setter方法当然能被修改了,这即使它的优点,也是它的缺点。

4.4 Autowired查找依赖顺序

        1、根据名称和类型去查。

        2、如果根据名称查不到,就会根据类型去查。

        根据名称查不到了,去查找类型,这时如果类型匹配多个,就会报错

5. @Autowired存在问题

        当同一类型存在多个bean时,使用@Autowired会存在问题。代码如下:

@Component
public class BeanConfig {@Beanpublic UserInfo userInfo1() {UserInfo user = new UserInfo();user.setId(6);user.setName("shenmengyao");user.setAge(18);return user;}@Beanpublic UserInfo userInfo2() {UserInfo user = new UserInfo();user.setId(7);user.setName("yuanyiqi");user.setAge(19);return user;}
}

        此时我们在UserController1类里面注入UserInfo类,代码如下:(下面这几个的注入方式都是错误的)

5.1 引入Autowired的错误代码:

5.1.1 属性注入:

        尝试运行出现如下结果: 

5.1.2 构造方法注入 

5.1.3 Setter方法注入 

5.1.4 启动类代码:

        上面这三种方式注入都会出问题,启动程序后,而报错信息也都是一样的,如上图所示:

        程序还没启动就失败了,可以看出来,Spring的依赖注入是在项目启动前就开始注入的了。

        上面报错提示:UserController1类需要一个bean,但是有两个,下面也打印出是哪两个bean了,Action介绍的就是解决方案。报错日志非常详细。

        报错信息说UserController1类找不到依赖注入的是哪一个,因为有多个方法被@bean注释,而依赖注入时,三个方法的属性名都是userInfo,系统先根据userInfo名称查找,但BeanConfig类没有这个方法名,那就只能去根据类名找了,但有2个bean,Spring就不知道要找那个了,并不是@bean注释下的方法名(userInfo1 / userInfo2),Spring并不知道该注入哪个依赖,所以报错了。

        在项目启动失败,可以把Filed看为属性,如上图:这个是使用属性注入的,会有Field

         构造方法和Setter注入都是第一张报错图,但就不是Field了,而是Parameter,但其实三种注入的报错原因都是一样的。

        解决方案:使用属性注入时,就把属性名改成bean修饰的其中之一的方法名就好了;使用@Parimary注解;使用@Qualifier注解;使用@Resource注解。

5.2 解决方案

5.2.1 解决方案一:根据名称去查

        属性名改成bean修饰的其中之一的方法名

1、属性注入:

2、构造方法注入: 

3、Setter方法注入:

        上面三种执行结果都一样,这里虽然注入了依赖,但没有用这些依赖;

5.2.1 解决方案二:

        给想要拿到的对象加上@Primary注解

        这个可以理解为依赖注入后,有多个依赖的方法,但默认使用加了@Primary的方法,代码如下:

1、UserController类

2、BeanConfig类:

代码运行结果:

         其他注入的方式,使用@Primary注解用法也一样,把想要拿到的对象加上@Primary注解就好了。

5.2.3 解决方案三:

        加@Qualifier注解,指定引入的依赖对象

UserController类:

        BeanConfig类和启动类与最初的代码一样,不用变。代码最终能够成功运行,结果和之前类似;

5.2.4 解决方案四:加@Resource注解

        这里和上面的三方案代码改变的只有UserController类,其他都不变,UserController类的代码如下:

@Controller
public class UserController {@Resource(name = "userInfo1")@Autowiredprivate UserInfo userInfo;public void sayHi() {System.out.println(userInfo.toString());System.out.println("hello, controller");}
}

        运行结果如下:

         这个注解不是Spring的,而是JDK本身自带的,JDK早期也有这样的注解,所以Spring不推荐使用这个注解,因为不是自己开发的,如果出现啥问题,不好处理,是有着不可控因素的原因;还有使用自家的东西也肯定会更放心一些。

5.3 @Autowired 与 @Resource 的区别

1、@Autowired 是 Spring框架提供的注解,而@Resource是JDK提供的注解。

2、@Autowired默认是按照类型注入,而@Resource是按照名称注入。相比于 @Autowired 来说,@Resource 支持更多的参数设置;例如 name 设置,根据名称获取 Bean。

6. Spring IoC&DI 的总结

1、Spring,Spring Boot 和 Spring MVC的关系以及区别
(1)、Spring
        简单来说,Spring是一个开发应用框架,其目的是用于简化企业级应用程序开发。

        Spring的主要功能:管理对象,以及对象之间的依赖关系,面向切面编程、数据库事务管理、数据访问、web框架支撑等等。

        Spring具备高度可开发性,并不强制依赖Spring,开发者可以自由选择Spring的部分或者全部,Spring可以无缝继承第三方框架,比如数据访问框架(Hibernate、JPA等等),web框架(如:Struts、JSF等等)。

(2)、Spring MVC
        Spring MVC是Spring的一个子框架,Spring诞生之后,大家按照MVC模式设计了一个MVC框架(用Spring解耦),主要用于开发WEB应用和网络接口,所以Spring MVC是一个Web框架。

        Spring MVC是基于Spring进行开发的,可以让我们更简洁的进行Web层开发,支持灵活的URL到页面控制器的映射,提供了强大的约定大于配置的契约式编程支持,非常容易与其他视图框架集成,如 Velocity、FreeMarker等等。

(3)、Spring Boot
        Spring Boot 是对Spring的一个封装,为了简化Spring一样的开发而出现的,使用Spring Boot 可以更加快速的搭建框架,降低开发成本,让开发人员更加专注于Spring应用的开发,而无需过多关注XML的配置和一些底层的实现。

        Spring Boot可以快速的集成其他框架进来。想使用Spring Boot开发Web项目,只需要引入Spring MVC框架即可,Web开发的工作是Spring MVC完成的,而不是Spring Boot,想完成数据访问,只需要引入Mybatis框架即可。

        Spring Boot只是辅助简化项目开发的,让开发变得更加简单,甚至不需要额外的web服务器,直接生成jar包执行即可。

(4)、总结
        Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包。

        之前写的图书管理系统代码中,整体框架是通过SpringBoot搭建的IoC,DI功能是Spring提供的,而Web相关功能是Spring MVC提供的。

        因为这三个专注的领域不同,所以解决的问题也不一样,总的来说,Spring就像一个大家族,有众多衍生产品,但它们的基础都是Spring;

2、bean的命名

(1)、五大注解存储的bean
1、类名前面两位字母均为大写,则bean名称为该类名本身(特殊情况)。

2、不是上面的特殊情况,其他的类名,首字母小写,驼峰形式命名。

3、通过 value 属性设置bean名 ,例如:@Controller (value = "user")。

(2)、@Bean注解存储的bean

1、bean名称为方法名。

2、通过name属性设置bean名,例如:@Bean (name = {"u1", "user1"})。

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0&vd_source=866da5be2ef0ddd213b053523da53138
————————————————

电子签名:上嘉路

 

相关文章:

Spring IoCDI(下)—DI的尾声

我们之前学习了控制反转IoC,接下来就开始学习依赖注入DI的细节。 依赖注入是一个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,而资源指的就是对象。我们使用 Autowired 注解,完成依赖注入的操作。简单来说…...

仕考网:考外省公务员可以调回本地吗?

一般情况下,公务员岗位是固定不可随意更换的,因为每个职位都对应特定的职责和要求。一旦考到外地的岗位,想要调回本地几乎是不可能的。因为这样的操作可能导致职位空缺,进而需要通过公共招聘流程来填补,而不是简单地从…...

《工厂模式在软件开发中的深度剖析与应用》

工厂模式 在软件开发的领域中,设计模式充当着解决常见问题的高效且可复用的策略角色。其中,工厂模式作为创建对象的重要设计模式,具有不可小觑的应用价值。接下来,我们将深入探讨简单工厂模式、工厂方法模式和抽象工厂模式。 一…...

双向通信之Websocket

介绍 Websocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP协议不同,websocket允许客户端与服务器之间的双向通信,可以在同一条连接上进行多次消息的快速传递。我之前在做一个线上刷题网站的时候,需要设计一个社区讨论模块&am…...

git学习使用碰到的问题1

本来在B站上看到的关于stash的使用时视频末尾讲到git stash drop 编号 会删除暂存记录 确实也是这么回事,但是末尾说到git stash pop 编号时up主说在恢复工作进度的时候我们可以直接删除掉这个工作记录可以直接使用 git stash pop stash{0} 使用完以后却出现了如上图…...

JavaScript初级——Math

一、Math 和其他的对象不同,它不是一个构造函数。它属于一个工具类,不用创建对象,里边封装了数学运算相关的属性和方法。 比如: Math.PI 表示圆周率。 二、Math.abs() —— 可以用来计算一个数的绝对值。 三…...

ffmpeg的基础命令

文章目录 ffmpeg/ffplay/ffprobe区别ffmpeg 的作用ffplay的作用ffprobe的作用 ffmpeg使用概述功能概述转码过程简单使用FFMPEG -i常用的 -i例子 ff***工具之间共享的选项ffmpeg主要选项ffmpeg提取音视频数据ffmpeg命令修改原有的视频格式ffmpeg命令裁剪和合并视频拼接视频的方式…...

二建机电工程实务试题内附答案

1.下列有色金属材料中,不属于铜合金的是()。 A.紫铜 B.青铜 C.黄铜 D.白铜【答案】A 2.用于完成介质间热量交换的换热设备是()。 A.分离器 B.反应器 C.冷凝器 D.分解锅【答案】C 3.工程测量的核心是()。 A.测量精度 B.设计要求 C.减少误差累积 D.检核【答案】D 4.吊…...

Redis的热key以及Big(大)key是什么?如何解决Redis的热key以及Big(大)key问题?

一、先讲讲什么是redis的热key问题 在Redis中,我们把访问频率高的Key,称为热Key。比如突然有几十万的请求去访问redis中某个特定的Key,那么这样会造成redis服务器短时间流量过于集中,很可能导致redis的服务器宕机。那么接下来对这…...

django学习入门系列之第九点《MySQL命令介绍一》

文章目录 MySQL命令数据库的管理(文件夹)查看现在已有的数据库(文件夹)创建数据库(文件夹)删除数据库(文件夹)进入数据库(文件夹)查看文件夹下所有的数据表&a…...

Mysql面试一

目录 一、事务的四大特性(ACID): 脏读 不可重复读 幻读 隔离性与隔离级别 数据库的三大范式 第一范式。确保数据表中的每个字段都是不可分割的最小单位,即原子性。这意味着表中的每一列都应代表一个独立的数据单元&#xff…...

模型优化之剪枝

文章目录 什么是神经网络剪枝剪枝的好处不同粒度的剪枝剪枝的分类非结构化剪枝结构化剪枝 哪些层的参数更容易被剪掉剪枝效果 什么是神经网络剪枝 神经网络剪枝 在训练期间删除连接密集张量将变得稀疏(用零填充)可以通过结构化块( n m nm nm&…...

JVM的组成

JVM 运行在操作系统之上 java二进制字节码文件的运行环境 JVM的组成部分 java代码在编写完成后编译成字节码文件通过类加载器 来到运行数据区,主要作用是加载字节码到内存 包含 方法区/元空间 堆 程序计数器,虚拟机栈,本地方法栈等等 随后来到执行引擎,主要作用是翻译字…...

快速上手 iOS Protocol Buffer

快速上手 iOS Protocol Buffer | 来自缤纷多彩的灰 本文主要介绍在 iOS 开发中如何快速上手使用 Protobuf。更多关于 Protobuf 的介绍和相关的功能 api,读者可自行查阅官网。 Protocol Buffer(简称 Protobuf)是一种由Google开发的语言中立、…...

每天一个数据分析题(四百八十)- 线性回归建模

关于线性回归建模,线性回归模型假设说法不正确的是? A. 因变量和自变量要有因果关系 B. 残差均值为0 C. 残差服从正态分布 D. 自变量不存在共线性 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专…...

电动汽车和混动汽车DC-DC转换器的创新设计与测试方法

汽车 DC-DC 转换器市场规模将达到187亿美元,年复合增长率为10%。 DC-DC 转换器是汽车的重要组成部分,它可以通过电压转换为各种车载系统供电,例如日益复杂的车载信息娱乐系统、使用驾驶辅助系统(ADAS)实现的增强安全功…...

OriginPro快速上手指南:数据可视化与分析的利器

目录 OriginLab - Origin and OriginPro - Data Analysis and Graphing Softwarehttps://www.originlab.com/​编辑 一、安装与界面概览 安装 界面概览 二、基础操作 数据输入 创建图表 三、高级功能 数据分析 自动化与脚本 Origin 提供了几个小工具 四、技巧与提示…...

缓存学习

缓存基本概念 概念 对于缓存,最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看,其本质上是因为缓存是基于内存建立的,而内存的读写速度相比之于硬盘快了xx倍,因此用内存来代替硬盘作为读写的介质当然能大大提高访…...

亚世光电:消费电子年度表演

机圈风云再起,消费电子乘风而起? 今天我们来聊——亚世光电 最近,华为mate60突然降价,被大家怀疑是为新品上市做准备,算算时间,下半年的消费电子大战也即将拉开帷幕,而亚世光电所在的光电显示领…...

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述(必写):2 技术方案与实施步骤2.1 模型选择(必写):2.2 数据的构建:2.3 功能整合(进阶): 3 实施步骤:3.1 环境搭建(…...

Qt-Qt中的小事项(7)

目录 命名风格 快捷键 查询文档 坐标系 代码理解 move 命名风格 这个也是老生常谈的问题了,入乡随俗就好啦 快捷键 这里是一些常用的快捷键,用多了自然就熟悉了 • 注释:ctrl/ • 运行:ctrlR • 编译:ctrlB …...

Android MediaRecorder 视频录制及报错解决

目录 一、start failed: -19 二、使用MediaRecorder录制视频 2.1 申请权限 2.2 布局文件 2.3 MediaRecordActivity 2.4 运行结果 三、拓展 3.1 录制视频模糊(解决) 3.2 阿里云OSS上传文件 3.2.1 权限(刚需) 3.2.2 安装SDK 3.2.3 使用 相关链接 一、start failed…...

HarmonyOS应用程序访问控制探究

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言 随着信息技术的飞速发展,移动应用程序已经成为…...

董卫民赴考拉悠然等企业调研,强调加快发展人工智能产业

8月14日,按照省政府重点产业链协同推进机制有关工作安排,省委常委、常务副省长董卫民在成都市调研人工智能产业发展情况,并召开座谈会。他强调,要坚决落实党的二十届三中全会精神和省委省政府决策部署,充分把握人工智能…...

MFC将类A中的事件在类B中处理采用回调函数实现

需求: 在类A的界面上有一个tab控件。tab控件上面有那个页面。在MFC编程中一个tab的一个页面就应该是一个新的类。在tab的一个页面上有一个list控件。现在需要将list控件的点击事件,双击事件等在类A里面处理。 解决: 在类B里面给控件list添加…...

公众号 微信登录

export function getWxCode(that, localhostUrl) { // localhostUrl 当前页面的路径 传这个也可以this.$route.fullPath// console.log(that.$store.state.wxSessionData)// console.log(that.$store.state.wxSessionData.openId)//openId为undefine执行获取openid判断是否没有…...

sanic + webSocket:股票实时行情推送服务实现

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

Unity动态给按钮各个状态下的图片赋值

Unity动态给按钮各个状态下的图片赋值 using UnityEngine; using UnityEngine.UI; public class ButtonOnClickTest : MonoBehaviour {public Button btn;public Sprite _highlighterSprite;public Sprite _pressedSprite;public Sprite _selectesdSprite;public Sprite _disa…...

xiaomi pad 6PRO 小米平板6 pro hyperOS降级 澎湃os 降级MIUI 14 教程 免解锁BL 降级,168小时解锁绑定

小米平板 6 Pro 机型代号 :liuqin 降级MIUI 14 小米澎湃 OS 正式版 澎湃OS安卓发布日期卡刷包线刷包OS1.0.7.0.UMYCNXM14.02024-07-13miui_LIUQIN_OS1.0.7.0.UMYCNXM_d618a5c980_14.0.zipliuqin_images_OS1.0.7.0.UMYCNXM_20240705.0000.00_14.0_cn_8cbf5920be.…...

MySQL 备份一个表

语法(创建一个与table1结构相同的新表table2,并且将table1的数据复制到table2): create table table2 as select * from table1 举例(备份tb_log表到tb_log_20240815中去): create table tb_log_20240815 as select * from tb_log...

鸿蒙开发入门day10-组件导航

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 组件导航 (Navigation) 设置页面显示模式 设置标题栏模式 设置菜…...

虚拟机Linux的坑 | VMware无法从主机向虚拟机 跨系统复制粘贴拖动 文件/文本

这个情况下,还是没办法跨系统拖拽文件 解决办法: 在终端中输入命令 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop过程中只要需要选择是否覆盖的地方,都输入&…...

Chat App 项目之解析(二)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…...

数据结构与算法 - 双指针

一、移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12]输出: [1,3,12,0,0]示例 2: 输入: nums …...

Python3网络爬虫开发实战(10)模拟登录(需补充账号池的构建)

文章目录 一、基于 Cookie 的模拟登录二、基于 JWT 模拟登入三、账号池四、基于 Cookie 模拟登录爬取实战五、基于JWT 的模拟登录爬取实战六、构建账号池 很多情况下,网站的一些数据需要登录才能查看,如果需要爬取这部分的数据,就需要实现模拟…...

SQL 调优最佳实践笔记

定义与重要性 SQL 调优:提高SQL性能,减少查询时间和资源消耗。目标:减少查询时间和扫描的数据行数。 基本原则 减少扫描行数:只扫描所需数据。使用合适索引:确保WHERE条件命中最优索引。合适的Join类型:…...

Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)

Eclipse的使用配置: Ⅰ、Eclipse 的必要配置:1、Eclipse 的安装:其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件,傻瓜式安装即可; 2、设置工作空间(workspace):其一、首次启动…...

遗传算法与深度学习实战(4)——遗传算法详解与实现

遗传算法与深度学习实战(4)——遗传算法详解与实现 0. 前言1. 遗传算法简介1.1 遗传学和减数分裂1.2 类比达尔文进化论 2. 遗传算法的基本流程2.1 创建初始种群2.2 计算适应度2.3 选择、交叉和变异2.4算法终止条件 3. 使用 Python 实现遗传算法3.1 构建种…...

Nginx+Tomcat实现负载均衡、动静分离集群部署

文章目录 一、Nginx​​实现负载均衡原理1.正向代理和反向代理2.负载均衡模式1. 轮询(Round Robin):2. 最少连接数(Least Connections):3. IP 哈希(IP Hash):4. 加权轮询…...

英语学习8月19日

词根前缀后缀 accomplishment 成就 acid n.酸的,adj.酸的 acidity n.酸性 ace adj.顶尖的 acute adj.敏锐的;急性的;严重的 acuity n.敏锐 obtuse adj.迟钝的;钝角的 acuity n.敏锐,严重 1.前缀ac: 尖&#x…...

关于windows环境使用nginx的一些性能问题

遇到的问题 最近在一个windows环境中部署nginx,遇到了以下问题: 1. nginx启动了九个线程(1master8woekr),但是所有链接都被1个woker接收,其余worker不工作 2. 用户端访问web很慢,登录服务器使…...

“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“

背景: 今天在日常的工作中, 我想将笔记本分屏到另一个显示屏,我这电脑Windows10,当我按下Windows键P键,提示我"你的电脑不能投影到其他屏幕,请尝试从新安装驱动程序或使用"遇到这种问题。 解决方法1: 1.快…...

第10章 无持久存储的文件系统 (2)

目录 10.1 proc文件系统 10.1.2 数据结构 10.1.3 初始化 10.1.4 装载 proc 文件系统 10.1.5 管理 /proc 数据项 10.1.6 读取和写入信息 10.1.7 进程相关信息 10.1.8 系统控制机制 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 10.1 proc文件…...

云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现

一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装…...

AI搜索引擎Perplexica的本地部署(之二)Perplexica的非docker安装

Perplex 是一个开源的AI 驱动的搜索引擎,可以使用 Grok 和 Open AI 等模型在计算机上本地安装和运行。它为学术研究、写作、YouTube 和 Reddit 提供了一系列搜索功能。用户可以通过选择不同的模型、设置本地嵌入模型和探索各种搜索选项来定制他们的体验。该工具演示…...

Oracle环境下在相同参数和数据源的情况,mybatis-plus查询和sql查询结果不一致

场景: 在系统中某个对象执行修改的时候,查询对象为空,造成修改报错 分析: 在传参中有一个eq的参数需要传null,mybatis-plus在执行eq时可能是拼成" null",但是oracle中查null必须要用is null, null是查不出东西的 解决: 改成用sql查询修改,或者加判断如果这个参…...

springboot静态资源访问问题归纳

以下内容基于springboot 2.3.4.RELEASE 1、默认配置的springboot项目,有四个静态资源文件夹,它们是有优先级的,如下: "classpath:/META-INF/resources/", (优先级最高) "classpath:/reso…...

HTML与CSS学习Day01

文章目录 一 、CSS技巧1.1 CSS精灵(CSS Sprites)1.1.1 实现步骤1.1.2 例子 1.2 字体图标1.2.1如何使用字体图标1.2.2 字体图标使用总结 1.3 垂直对齐方式vertical-align1.3.1 值1.3.2 例子 1.4 过渡效果transition1.4.1 CSS过渡效果(transiti…...

Tina-Linux Bootloaer简述

Tina-Linux Bootloaer简述 目录介绍 ubuntuubuntu1804:~/tina-v2.0-sdk/lichee/brandy-2.0$ tree -L 1 . ├── build.sh ├── opensbi ├── spl //boot0 ├── spl-pub //boot0 ├── tools └── u-boot-2018 /ubootTina-Linux 启动流程简述...

【Python】 Scrapyd:Python Web Scraping 的强大分布式调度工具

我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 🎵 许嵩《内线》 在网络爬虫项目中,Scrapy 是 Python 中最流行和…...