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

Spring IOC实战指南:从零到一的构建过程

Spring 优点:

  1. 方便解耦,简化开发。将所有对象创建和依赖关系维护交给 Spring 管理(IOC 的作用)
  2. AOP 切面编程的支持。方便的实现对程序进行权限的拦截、运行监控等功能(可扩展性)
  3. 声明式事务的支持。只需通过配置就可以完成对事务的管理,无需手动编程
  4. 方便程序测试。Spring 对 junit4 支持,可以通过注解方便测试 Spring 程序
  5. 方便集成各种优秀框架
  6. 降低 API 的使用难度

IOC:控制权反转

  1. 作用:
    1. 将创建对象的过程交给 Spring 框架进行管理
    2. 降低代码的耦合度。利用 IOC 容器进行控制
      1. 一个程序失控后不会影响其他程序的运转
  2. 使用:
    1. 创建 Maven 项目,导入依赖:
      <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
      </dependencies>
    2. 项目基本结构:
    3. 编写 Spring 核心的配置文件:
      1. 在 resources 下边创建 application.xml 文件
    4. xml 方式创建对象:
      <!--IOC容器管理的bean-->
      <!--利用spring工厂创建对象-->
      <!--id: 唯一表示符 -> 对象名称 -->
      <!--class: 类的全路径-->
      <bean id="userService" class="com.qcby.spring.service.impl.UserServiceImpl" />
    5. 测试类:
      public class TestIOC {//传统调用@Testpublic void run(){UserServiceImpl userService = new UserServiceImpl();userService.sayHello();}//Spring 创建对象写法@Testpublic void  run(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");UserServiceImpl userService = (UserServiceImpl) applicationContext.getBean("userService");userService.sayHello();}
      }
  3. IOC 技术总结:
    1. ApplicationContext 接口:工厂的接口,使用接口可以获取到具体的 Bean 对象
    2. 该接口下有两个实现类,SpringCould 配置中心:
      1. ClassPathXmlApplicationContext:加载类路径下的 Spring 配置文件
      2. FileSystemXmlApplicationContext:加载本地磁盘下的 Spring 配置文件

Spring 对对象的管理:

  1. 分类:
    1. 基于配置文件的方式:
      1. 创建对象
      2. 注入属性
    2. 基于注解方式实现:
      1. 创建对象
      2. 注入属性
  2. Spring 框架的 Bean 管理的配置文件的方式:
    1. ID 属性:        
      1. 给 Bean 起个名字,在约束中采用 ID 的唯一约束
      2. 取值要求:必须以字母开始,可以使用字母、数字、下划线、句号、冒号。不能出现特殊字符
    2. class 属性:Bean 对象的全路径
    3. scope 属性:scope 属性代表 Bean 的作用范围
    4. singleton 属性:表示单例 (默认值),最常用的方式
    5. prototype 属性:应用在 Web 项目中,同一个 HTTP Session 共享一个 Bean
  3. Bean 对象的创建和销毁的两个属性配置:
    1. 说明:
      1. Spring 初始化 Bean 或销毁 Bean 时,有时需要做一些处理工作,因此 spring 可以在创建和拆卸 bean 的时候调用 bean 的两个声明周期方法
    2. init-method 属性:当 bean 被加载到容器的时候用 init-method 属性指定的方法
    3. destory-method 属性:当 bean 从容器中删除的时候用 destory-method 属性指定的方法
  4. 实例化 Bean 对象的三种方法:
    1. 默认无参数的构造方法(默认方法,基本使用)
      <bean id="userService" class="com.qcby.spring.service.impl.UserServiceImpl" ><property name="name" value="张三"/><property name="age" value="44"/>
      </bean>
    2. 静态工厂实例化方法:

      /*** 静态工厂方式*/
      public class StaticFactory {//静态工厂方式public static UserService creatUs(){System.out.println("静态工厂方式创建 UserServiceImpl对象");//业务逻辑 + 权限校验return new UserServiceImpl();}
      }//配置文件
      <bean id="us" class="com.qcby.spring.factory.StaticFactory" factory-method="creatUs"></bean>
    3. 动态工厂实例化方法:

      /*** 动态工厂实例化方式*/
      public class Dfactory {public UserService craeatUs(){System.out.println("动态实例化工厂的方式");//业务逻辑 + 权限校验return new UserServiceImpl();}
      }//配置文件
      <bean id="dfactory" class="com.qcby.spring.factory.Dfactory"></bean>
      <bean id="us" factory-bean="dfactory" factory-method="craeatUs"></bean>

DI:依赖注入

  1. IOC 和 DI 的概念:
    1. IOC:Inverse  of  Control,控制权反转,将对象创建权反转给 Spring
    2. DI:Dependency  Injection,依赖注入,在 Spring 框架负责创建 Bean 对象时,动态的将依赖对象注入到 Bean 组件中
  2. set 方法注入属性:
    1. <property name="" value = "" />
    2. 注意:给类、集合、列表和 map 集合,property 类型赋值的方式
    3. 实体类:
      public class User {private String name;private Integer age;private Demo demo;private String[] strs;List<String> list;Map<String,String> map;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", demo=" + demo +", strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +'}';}//get set 方法
    4. 注入属性:
          <!--IOC容器管理的bean--><!--id:唯一表示符--><!--class:类的全路径--><bean id="demo" class="com.spring.service.Demo"/><bean id="uesr" class="com.spring.service.User"><property name="name" value="张三"/><property name="age" value="18"/><!--        给对象赋值  &ndash;&gt; 用 ref 属性   首先要有这个对象--><property name="demo" ref="demo"/><!--        给数组赋值 利用 <array></array>--><property name="strs"><array><value>熊大</value><value>熊二</value></array></property><!--给list列表赋值利用  <list></list>--><property name="list"><list><value>张胜男</value><value>理事长</value></list></property><!--给 map 赋值<map>  <emtry key = ""  value = "" /> </map>--><property name="map"><map><entry key="张三" value="河北"/><entry key="李思思" value="北京"/></map></property></bean>
      </beans>
  3. 利用构造器注入属性:
    1. <constructor-arg  name = '' "  value = " ">
    2. 实体类:
      public class User {private String name;private Integer age;private Demo demo;private String[] strs;List<String> list;Map<String,String> map;public User(String name, Integer age, Demo demo, String[] strs, List<String> list, Map<String, String> map) {this.name = name;this.age = age;this.demo = demo;this.strs = strs;this.list = list;this.map = map;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", demo=" + demo +", strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +'}';}}
    3. 注入数据:
       <!--IOC容器管理的bean--><!--id:唯一表示符--><!--class:类的全路径--><bean id="demo" class="com.spring.service.Demo"/><bean id="user" class="com.spring.service.User"><constructor-arg name="name" value="张胜男"/><constructor-arg name="age" value="18"/><!--给对象赋值 利用 ref --><constructor-arg name="demo" ref="demo"/><!--给数组赋值--><constructor-arg name="strs"><array><value>张思思</value><value>王菲</value><value>李思琪</value></array></constructor-arg><!--给 list 列表赋值--><constructor-arg name="list"><list><value>1111</value><value>aaaa</value></list></constructor-arg><!--给 map 集合赋值 利用 entry--><constructor-arg name="map"><map><entry key="111" value="sss"/><entry key="222" value="aaa"/></map></constructor-arg><!--给 property 类型赋值内部是  key  value 形式--><constructor-arg name = "properties"><props><prop key = "username">root</prop><prop key = "age">18</prop></props></constructor-arg></bean>
      </beans>

注解创建对象:

  1. 配置扫描固定的包:
    1. 作用:把当前类使用 IOC 容器进行管理,如果没有指定名称,默认使用类名,首字母小写方式命名
      //扫描固定包下的文件
      <context:component-scan base-package="com.spring.service"/>
  2. bean 管理类常用注解:
    1. @Component():普通的类
    2. @Controller():表现层
    3. @Service():业务层
    4. @Repository():持久层
      @Component(value = "user")
      //@Controller()
      //@Service()
      //@Repository()
      public class user{@Value("zhang")     //--->一般针对于包装类和基本数据类型private String name;@Value("男")private Integer age;@Value("男")private String sex;@Autowired()    //----> 对对象类型直接注入private Demo demo;
      }
  3. 依赖注入常用的注解:
    1. @Value():用于注入基本类型数据
    2. @Autowired():用于注入引用类型
    3. @Qualifier():和 @Autowired 一起使用,强制使用名称注入
    4. @Resource():一般不用( jdk 提供),按名称注入对象
    5. @Scope:声明周期注解
      1. singleton(默认值):单实例
      2. prototype:多例
  4. 初始化方法和销毁方法注解:
    1. @PostConstrust 相当于 init-method
    2. @PreDestroy 相当于 destroy-method
  5. 不用配置文件,用注解赋值方式:
    1. 实体类配置:
      @Configuration      //标明当前类为配置类
      @ComponentScan(value = "com.spring.service")    //扫描固定的包
      public class User {@Value("zhang")     //--->一般针对于包装类和基本数据类型private String name;@Value("18")private Integer age;@Value("男")private String sex;@Autowired()    //----> 对对象类型直接注入private Demo demo;}
    2. 测试类获取:
      public class Test {public static void main(String[] args) {ApplicationContext ac = new AnnotationConfigApplicationContext(User.class);User user = (User) ac.getBean("user");System.out.println(user.toString());}
      }

多配置文件形式:

  1. 在加载配置文件时,后多加自己需要的配置文件:
  2. 在一个配置文件中利用 <import   resource = " " /> 引入另一个配置文件:

Spring 框架开发方式:

  1. 需求:编写 service 和 dao  的类
  2. 技术选择:持久层使用 JDBC 的程序,连接池是 Druild 连接池,创建 maven 工程,导入 jar 包
  3. 开发流程:
    1. 导入相关 jar 包:
      <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency></dependencies>
    2. 创建数据库,创建表结构:
      create database spring_db;
      use spring_db;
      create table account(id int primary key auto_increment,name varchar(40),money double
      )character set utf8 collate utf8_general_ci;insert into account(name,money) values('aaa',1000);
      insert into account(name,money) values('bbb',1000);
      insert into account(name,money) values('ccc',1000);
    3. 编写 JavaBean 类:
      public class Account implements Serializable {public static final Long serialVersionUID = 7355810572012650248L;private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", nane='" + name + '\'' +", money=" + money +'}';}
      }
    4. 编写 AccountDao 接口实现类:
      public class AuccountDaoImpl implements AccountDao {//注入连接池对象private DataSource dataSource;public void setDataSource(DataSource dataSource){this.dataSource = dataSource;}/*** 查询所有的数据* @return*/@Overridepublic List<Account> finAll() {List<Account> list = new ArrayList<>();Connection connection = null;PreparedStatement stmt = null;ResultSet rs = null;try{//获取链接connection = dataSource.getConnection();//编写 sqlString sql = "select * from account";//预编译stmt = connection.prepareStatement(sql);//查询数据rs = stmt.executeQuery();//遍历结构集while(rs.next()){Account account = new Account();account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setMoney(rs.getDouble("money"));}}catch (Exception e){e.printStackTrace();}finally {try{connection.close();stmt.close();rs.close();}catch (Exception e){e.printStackTrace();}}return list;}
      }
    5. 编写配置文件:
      <!--配置连接池-->
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///spring_db"/><property name="username" value="root"/><property name="password" value="root"/>
      </bean><!--管理Bean-->
      <bean id="accountService" class="com.spring.service.Impl.AccountServiceImpl"><property name="accountDao" ref="accountDao"/>
      </bean>
      <bean id="accountDao" class="com.spring.dao.Impl.AuccountDaoImpl"><property name="dataSource" ref="dataSource"/>
      </bean>
    6. 编写测试程序:
      public class Test {@org.junit.Testpublic void run(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("aaplication.xml");AccountService accountService = (AccountService) applicationContext.getBean("accountService");List<Account> list = accountService.findAll();for (Account account : list){System.out.println(account);}}
      }

 IOC纯注解方式:

  1. 概述:
    1. 纯注解方式是微服务架构开发的主要方式
    2. 替换掉所有的配置文件,但是需要写配置类
  2. 常用的注解:
    1. @Configuration:声明该类为配置类
    2. @ComponentScan:扫描具体包结构
    3. @Import:用于导入其他配置类
      //Spring 配置类,替换掉 applicationContext.xml
      //声明当前是配置类
      @Configuration
      //扫描指定的包结构
      @ComponentScan("com.qcby.spring")
      //导入其他配置类
      @Import(value = SpringConfig2.class)
      public class SpringConfig {}@Component
      public class SpringConfig2 {
      }
    4. @Bean:只能写在方法上,表明使用此方法创建一个对象,对象创建完成保存到 IOC 容器中
      @Bean(name="dataSource")
      public DataSource creatDataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///community");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;
      }
  3. 案例:
    1. 编写实体类:
      @Component
      public class Order {@Value("北京")private String address;@Overridepublic String toString() {return "Order{" +"address='" + address + '\'' +'}';}
      }
    2. 编写配置类:
      //Spring 配置类,替换掉 applicationContext.xml
      //声明当前是配置类
      @Configuration//扫描指定的包结构
      @ComponentScan("com.qcby.spring")
      public class SpringConfig {}
    3. 编写测试方法:
      @Test
      public void run1(){//创建工厂,加载配置类ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);//获取对象Order order = (Order) ac.getBean("order");System.out.println(order);
      }

Spring 框架整合 JUnit 单元测试:

  1. 导入依赖:
    <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.2.RELEASE</version><scope>test</scope>
    </dependency>
  2. 配置文件形式:
    1. 编写类和方法,并把该类交给 IOC 容器进行管理:
      public class User {public void sayHello(){System.out.println("Hello");}
      }
    2. 编写配置文件:
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.qcby.spring.pojo.User"></bean></beans>
    3. 编写测试方法
      //Spring整合单测试
      @RunWith(value = SpringJUnit4ClassRunner.class)
      @ContextConfiguration(value = "classpath:application_test.xml")
      public class Demo {//自动注入@Autowiredprivate User user;@Testpublic void run1(){user.sayHello();}
      }
  3. 纯注解方式整合单元测试:
    1. 编写类和方法:
      @Component
      public class Customer {public void save(){System.out.println("保存客户");}
      }
    2. 编写配置方法:
      //声明配置类
      @Configuration
      //扫描包
      @ComponentScan(value = "com.qcby.spring")
      public class SpringConfig3 {}
    3. 编写测试方法:
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(classes = SpringConfig3.class)
      public class Demo2 {//注入对象@Autowiredprivate Customer customer;//测试@Testpublic void run(){customer.save();}
      }

相关文章:

Spring IOC实战指南:从零到一的构建过程

Spring 优点&#xff1a; 方便解耦&#xff0c;简化开发。将所有对象创建和依赖关系维护交给 Spring 管理(IOC 的作用)AOP 切面编程的支持。方便的实现对程序进行权限的拦截、运行监控等功能(可扩展性)声明式事务的支持。只需通过配置就可以完成对事务的管理&#xff0c;无需手…...

3.langchain中的prompt模板 (few shot examples in chat models)

本教程将介绍如何使用LangChain库和智谱清言的 GLM-4-Plus 模型来理解和推理一个自定义的运算符&#xff08;例如使用鹦鹉表情符号&#x1f99c;&#xff09;。我们将通过一系列示例来训练模型&#xff0c;使其能够理解和推断该运算符的含义。 环境准备 首先&#xff0c;确保…...

量子感知机

神经网络类似于人类大脑&#xff0c;是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题&#xff0c;是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…...

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上&#xff0c;给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上&#xff0c;打开 服务&#xff0c;找到VMware DHCP和VMware NAT&#xff0c;把这两个服务打开&#xff0c;专一般问题就…...

IDEA 基本设置

设置主题 设置字体 设置编码格式 改变字体大小 开启 按住 ctrl 滚轮 改变字体大小。 开启自动编译...

Chrome 浏览器 131 版本新特性

Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本更新 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来&#xff0c;用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能&#xff0c;请访问网站&#xff0c;并点击聚焦时出现在地…...

使用php和Xunsearch提升音乐网站的歌曲搜索效果

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

计算机毕设-基于springboot的高校网上缴费综合务系统视频的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

STL关联式容器之map

map的特性是&#xff0c;所有元素都会根据元素的键值自动被排序。map的所有元素都是pair&#xff0c;同时拥有实值(value)和键值(key)。pair的第一元素被视为键值&#xff0c;第二元素被视为实值。map不允许两个元素拥有相同的键值。下面是<stl_pair.h>中pair的定义 tem…...

【HarmonyOS】鸿蒙应用唤起系统相机拍照

【HarmonyOS】鸿蒙应用唤起系统相机拍照 方案一&#xff1a; 官方推荐的方式&#xff0c;使用CameraPicker来调用安全相机进行拍照。 let pathDir getContext().filesDir;let fileName ${new Date().getTime()}let filePath pathDir /${fileName}.tmpfileIo.createRandomA…...

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…...

Java基础夯实——2.7 线程上下文切换

线程上下文切换&#xff08;Thread Context Switching&#xff09;是操作系统在多线程环境中&#xff0c;切换CPU从执行一个线程的上下文到另一个线程的上下文的过程。这种切换是实现多线程并发执行的核心机制之一。 1 上下文: 线程的上下文指线程在某一时刻的执行状态,如&am…...

死锁相关习题 10道 附详解

2022 设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5)&#xff0c;A资源的数量是17&#xff0c;B资源的数量是6&#xff0c;C资源的数量是19。在T0时刻系统的状态&#xff1a; 最大资源需求量已分配资源量A&#xff0c;B&#xff0c;CA&#xff0c;B&#xff0c;…...

VisionPro 机器视觉案例 之 彩色保险丝个数统计

第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计 文章目录 第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计1.案例要求2.实现思路2.1 方法一 颜色分离工具CogColorSegmenterTool将每一种颜色分离出来&#xff0c;得到对应的单独图像&#xff0c;使用斑点工具CogBlo…...

go-zero(七) RPC服务和ETCD

go-zero 实现 RPC 服务 在实际的开发中&#xff0c;我们是通过RPC来传递数据的&#xff0c;下面我将通过一个简单的示例&#xff0c;说明如何使用go-zero框架和 Protocol Buffers 定义 RPC 服务。 一、生成 RPC项目 在这个教程中&#xff0c;我们根据user.api文件&#xff0…...

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建&#xff0c;本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目&#xff1b; Generic Webhook Trigger 插件 实现代码推送后&#xff0c;触…...

043 商品详情

文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…...

【人工智能】Python与Scikit-learn的模型选择与调参:用GridSearchCV和RandomizedSearchCV提升模型性能

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习建模过程中,模型的表现往往取决于参数的选择与优化。Scikit-learn提供了便捷的工具GridSearchCV和RandomizedSearchCV,帮助我们在参数空间中搜索最佳组合以提升模型表现。本文将从理论和实践两个角度…...

深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动

背景介绍 现代爬虫技术中&#xff0c;模拟人类行为已成为绕过反爬虫系统的关键策略之一。无论是模拟用户点击、滚动&#xff0c;还是鼠标的轨迹移动&#xff0c;都可以为爬虫脚本带来更高的“伪装性”。在众多的自动化工具中&#xff0c;Puppeteer作为一个无头浏览器控制库&am…...

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools

原因 想用 apt-get download 存到本地 / NAS上&#xff0c;减少网络流浪。 看到 VMware 上的确实有 ubuntu&#xff0c;只是版本是16。 ubuntu 版本比较&#xff1a;LTS vs RR LTS: Long-Term Support 长周期支持&#xff0c; 一般每 2 年更新&#xff0c;会更可靠与更稳定…...

C#调用JAVA

参考教程&#xff1a;使用IKVMC转换Jar为dll动态库(含idea打包jar方法)-CSDN博客 已经实践过&#xff0c;好使。...

JavaEE-多线程基础知识

文章目录 前言与回顾创建一个多线程线程的创建以及运行机制简述step1: 继承Thread类step2: 实现Runable接口step3: 基于step1使用匿名内部类step4: 基于step2使用匿名内部类step5: 基于step4使用lambda表达式(推荐) Thread的常见方法关于jconsole监视线程的工具构造方法解析获取…...

Pulid:pure and lightning id customization via contrastive alignment

1.introduction 基于微调的方案,对每个id进行定制需要花费数十分钟。另一项研究则放弃了对每个id进行微调,而是选择在一个庞大的肖像数据集上预训练一个id适配器。这些方法通常利用编码器例如clip来提取id特征,提取的特征随后以特定方式例如嵌入到cross attention集成到基础…...

什么是GraphQL,有什么特点

什么是GraphQL&#xff1f; GraphQL 是一种用于 API&#xff08;应用程序编程接口&#xff09;的查询语言&#xff0c;由 Facebook 在 2012 年开发&#xff0c;并于 2015 年开源。它提供了一种更高效、强大的方式来获取和操作数据&#xff0c;与传统的 RESTful API 相比&#…...

Java项目-基于SpringBoot+vue的租房网站设计与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作

1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法&#xff0c;以及通过理论课学习与实验参考书的帮助&#xff0c;熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作&#xff1b;作为后续实验的基础&#xff0c;根据实验要求重…...

【大数据学习 | Spark】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中&#xff0c;存在许多迭代式计算&#xff0c;这些应用场景的共同之处是&#xff0c;不同计算阶段之间会重用中间结果&#xff0c;即一个阶段的输出结果会作为下一个阶段的输入。但是&#xff0c;目前的MapReduce框架都是把中间结果写入到HDFS中&…...

ruoyi框架完成分库分表,按月自动建表功能

前提 这个分库分表功能&#xff0c;按月自动建表&#xff0c;做的比较久了&#xff0c;还没上线&#xff0c;是在ruoyi框架内做的&#xff0c;踩了不少坑&#xff0c;但是已经实现了&#xff0c;就分享一下代码吧 参考 先分享一些参考文章 【若依系列】集成ShardingSphere S…...

Antd中的布局组件

文章目录 一、Layout二、Menu三、Grid栅格 布局组件涉及项目框架的搭建&#xff0c;往往被忽略和低关注&#xff0c;毕竟不是经常用到&#xff0c;但是在调整项目结构的时候往往又需要重新设计布局&#xff0c;所以有必要提前归纳分析&#xff1b; 一、Layout Layout导出Sider,…...

一文详解kafka知识点

目录 1、kafka定义 2、消息队列 2.1、产品选择 2.2、应用场景 2.3、消息队列的两种模式 3、kafka架构 4、kafka生产者 4.1、kafka生产者原理 4.2、kafka生产者异步发送 4.3、同步发送 4.4、分区 4.4.1、kafka分区好处 4.4.2、分区策略 4.4.3、自定义分区 4.5、生成吞…...