基于XML实现SpringIoC配置
目录
SpringIoc创建与使用的大致步骤
一.基于xml配置SpringIoc
二.基于xml配置DI
三.创建IoC容器并获取组件
SpringIoc创建与使用的大致步骤
SpringIoC的创建与使用过程分为3步
1.编写配置信息(编写XML,注解、Java类)
2.创建IoC容器(实例化Ioc对象)
3.从Java代码中获取组件并使用
一.基于xml配置SpringIoc
实现过程思路:
1.配置SpringIoc的jar包依赖
<!-- SpringIoc核心jar包 包含core ioc breans 等 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!-- junit5测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version> <!-- 使用属性引用JUnit Jupiter版本 --><scope>test</scope></dependency>
2.编写xml配置文件(配置xml相关约束)
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
由于SpringIoc是存放组件的容器,而组件内容是可重复使用的对象。在xml中<bean>标签就是代表着组件
3.三种创建组件的方式
不同的创建组件的方式,对应的xml配置也不同。下面介绍三种创建组件的方式,无参构造方式创建组件,静态工厂创建、非静态工厂创建
1.无参构造方式创建组件
当通过构造函数方法创建一个bean(组件对象) 时,所有普通类都可以由 Spring 使用并与之兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定的方式进行编码。只需指定 Bean 类信息就足够了。但是,默认情况下,我们需要一个默认 (空)构造函数。
无参构造对象代码案例
package com.alphamilk.Ioc;
//无参构造类
public class wucanTemp {public void doWork(){System.out.println("调用无参构造方法doWork函数");}
}
对应的xml配置:
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 无参构造方式配置<bean 一个组件信息 一个组件对象id:组件的唯一标识,不可重复class:组件通过反射创建,所以需要类的权限定符配置完一个组件相当于new了一个wucanTemp对象
-->
<bean id="wucanTemp" class="com.alphamilk.Ioc.wucanTemp"/>
</beans>
2.静态工厂创建组件
静态工厂代码:
package com.alphamilk.Ioc;//静态工厂代码
public class HelloTemp {private HelloTemp(){}public static HelloTemp getHelloTemp(){HelloTemp temp = new HelloTemp();return temp;}
}
对应XML配置:
<!-- 静态工厂的组件配置<bean 一个组件信息,一个组件对象 ,一个工厂静态方法id:组件的唯一标识class:类的权限定符factory-method:工厂的静态方法
--><bean id="helloTemp" class="com.alphamilk.Ioc.HelloTemp" factory-method="getHelloTemp"/>
3.非静态工厂创建组件
package com.alphamilk.Ioc;//非静态工厂
public class FactoryNoStatic {private static FactoryNoStatic factoryNoStatic = new FactoryNoStatic();public FactoryNoStatic getInstance(){return factoryNoStatic;}
}
对应的XML配置
<!-- 3非静态工厂配置组件-->
<!-- 3.1配置工厂类的组件信息--><bean id="factoryNoStatic" class="com.alphamilk.Ioc.FactoryNoStatic"/><!-- 3.2通过指定非静态工厂对象和方法名来配置生成的ioc信息--><bean id="factoryNoStatic2" factory-bean="factoryNoStatic" factory-method="getInstance"/>
二.基于xml配置DI
DI(依赖注入)有两种实现方式
第一种通过构造函数实现,另一种是通过setter实现,两种不同的方式实现对应的xml配置也有所不同。下边分别介绍每种的配置。
1.基于构造函数实现对象
基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项下面的示例演示一个只能通过构造函数注入进行依赖项注入的类!
基于单参构造方法
类对象案例:
package com.alphamilk.loc2;public class UserDao {
}public class UserService {private UserDao userDao = new UserDao();private String name;private int age;// 单参构造方法UserService(UserDao userDao){this.userDao = userDao;}
// 多参构造方法UserService(String name,int age,UserDao userDao){this.name=name;this.age = age;this.userDao = userDao;}
}
单参构造方法下,DI(依赖注入)的配置
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 单参数构造方法-->
<!-- 步骤1:将对象都存放在IOc容器中-->
<bean id="userDao" class="com.alphamilk.loc2.UserDao"/><!-- 构造参数传递di的配置<constructor-org 构造参数传值的di配置value=直接属性值ref = 引用其它的bean组件,传入bean的id值
--><bean id="service" class="com.alphamilk.loc2.UserService"><constructor-arg ref="userDao"/></bean>
</beans>
多参情况下DI(依赖注入)对应xml配置
<!-- 基于多参构造方法-->
<!-- 步骤1:将对象存放在Ioc容器中--><bean id="userDao" class="com.alphamilk.loc2.UserDao"/><bean id="service" class="com.alphamilk.loc2.UserService">
<!-- 方案1:通过使用name对应参数配置【推荐】--><constructor-arg name="age" value="29"/><constructor-arg name="name" value="黄小龙"/><constructor-arg name="userDao" ref="userDao"/></bean><bean id="userDao" class="com.alphamilk.loc2.UserDao"/><bean id="service" class="com.alphamilk.loc2.UserService">
<!-- 方案2:通过顺序的方式传递参数--><constructor-arg value="黄小龙"/><constructor-arg value="29"/><constructor-arg ref="userDao"/></bean><bean id="userDao" class="com.alphamilk.loc2.UserDao"/><bean id="service" class="com.alphamilk.loc2.UserService"><!-- 方案3:通过下角标位置的方式传递参数--><constructor-arg index="0" value="黄小龙"/><constructor-arg index="1" value="29"/><constructor-arg index="2" ref="userDao"/></bean>
2.基于setter函数实现对象
基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项
下面的示例演示通过构造函数注入多个参数,参数包含其他 bean和基本数据类型!
类对象案例:
package com.alphamilk.loc3;public class UserDao {
}//setter方式注入
public class UserService {private UserDao userDao = new UserDao();private String name;private int age;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}
对应xml配置
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--触发 setter方法进行注入--><bean id="userDao" class="com.alphamilk.loc3.UserDao"/>
<!-- name-》属性名 setter方法的 去掉set并且首字母小写的值! 调用set方法名比如setName -》namevalue | ref 进行二选一 value=直接属性值 ref = 其他bean的id
--><bean id="service" class="com.alphamilk.loc3.UserService"><property name="age" value="52"/><property name="name" value="张三"/><property name="userDao" ref="userDao"/></bean>
</beans>
三.创建IoC容器并获取组件
1.创建Ioc容器对象
首先类对象
package com.alphamilk.loc4;public class HelloTemp {public void doWork(){System.out.println("HelloTemp is Working");}
}
然后进行xml文件配置IoC
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloTemp" class="com.alphamilk.loc4.HelloTemp"/>
</beans>
两种实现创建IoC容器对象
package com.alphamilk.Ioc;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {
// 创建SpringIoc容器方法
/*两个接口BeanFactoryApplicationContext四个实现类ClassPathXmlApplicationContext 读取类路径下的xml配置方式WebApplicationContext读取指定文件的xml配置方式FileSystemXmlApplicationContext读取配置类方式的ioc容器AnnotationApplicationContext web项目专属的配置ioc容器*/@org.junit.jupiter.api.Testpublic void createIoc(){
// 方式一:通过直接创建容器并且指定配置文件即可ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Springioc.xml");// 方式二:通过先创建ioc容器对象,再指定配置文件,再刷新ClassPathXmlApplicationContext applicationContext1 = new ClassPathXmlApplicationContext();applicationContext1.setConfigLocations("Springioc.xml");applicationContext1.refresh();}
}
2.通过创建的容器获取组件
获取组件步骤:1.创建ioc容器 2.获取组件
三种获取组件方式:
- 第一种获取bean的方式,通过获取getBean加上bean的id,返回Object类型,再将其转为对应的类型。
- 第二种获取bean的方式,通过获取bean的同时,指定其返回的类型。
- 第三种获取bean方式,根据类型获取。
package com.alphamilk.Ioc;import com.alphamilk.loc4.HelloTemp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {@org.junit.jupiter.api.Testpublic void useBean(){// 第一种获取bean的方式,通过获取getBean加上bean的id,返回Object类型,再将其转为对应的类型
// 创建Ioc容器ApplicationContext context = new ClassPathXmlApplicationContext("springioc.xml");
// 获取组件HelloTemp helloTemp = (HelloTemp) context.getBean("helloTemp");// 第二种获取bean的方式,通过获取bean的同时,指定其返回的类型
// TODO:注意可能会出现向下转型异常
// 创建Ioc容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();applicationContext.setConfigLocation("springioc.xml");applicationContext.refresh();
// 获取组件applicationContext.getBean("helloTemp",HelloTemp.class);// 第三种获取bean方式,根据类型获取
// 创建Ioc容器ClassPathXmlApplicationContext classPathXmlApplicationContext2 = new ClassPathXmlApplicationContext();classPathXmlApplicationContext2.setConfigLocation("springioc.xml");classPathXmlApplicationContext2.refresh();
// 获取组件
// TODO:注意这种方法有许多条件
// 根据bean类型获取,一次只能有一种类型,举例在ioc容器中如果有多个HelloTemp对象,继续使用这种方法会报错classPathXmlApplicationContext2.getBean(HelloTemp.class);// 注意虽然是三种不同的获取方式,但是获取到的对象都是同一个,三种方法只是对应三种类型的指针指向Ioc容器中存放的组件helloTemp.doWork();}
}
基于注解配置
SpringIoC基于注解配置_Alphamilk的博客-CSDN博客
相关文章:
基于XML实现SpringIoC配置
目录 SpringIoc创建与使用的大致步骤 一.基于xml配置SpringIoc 二.基于xml配置DI 三.创建IoC容器并获取组件 SpringIoc创建与使用的大致步骤 SpringIoC的创建与使用过程分为3步 1.编写配置信息(编写XML,注解、Java类) 2.创建IoC容器&…...
Kaniko在containerd中无特权快速构建并推送容器镜像
目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑,我们选择了kaniko作为镜像打包工具,它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…...
分享5款不会被打入冷宫的神器软件
检查一下你最近安装的软件,他们是不是都一样无法避免最终被你打入冷宫的命运?我们明明很懂“在精不在多”的道理,却依然让我们的电脑塞满了形形色色无用的软件。你需要知道的是,如何找到一款适合自己且真正实用的电脑软件。 自…...
Windows如何部署Redis
一、简介 Redis (Remote Dictionary Server) 是一个由意大利人 Salvatore Sanfilippo 开发的 key-value 存储系统,具有极高的读写性能,读的速度可达 110000 次/s,写的速度可达 81000 次/s 。 二、下载 访问 https://github.com/tporadows…...
VUE数据双向绑定原理解析
VUE数据双向绑定原理解析 在Vue.js中,数据双向绑定是一项非常强大的功能。它使开发者能够轻松地将模板与数据进行动态关联,实现了页面和数据之间的实时同步更新。本文将深入探讨VUE中数据双向绑定的原理,并通过代码示例演示其工作机制。 1.…...
SSM商城项目实战:订单管理
SSM商城项目实战:订单管理 在SSM商城项目中,订单管理是一个非常重要的功能模块。本文将详细介绍订单管理的实现思路和步骤代码。 实现SSM商城项目中订单管理功能的思路如下: 设计数据库表结构:根据订单管理的需求,设计…...
SELinux 入门 pt.2
哈喽大家好,我是咸鱼 在《SELinux 入门 pt.1》中,咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念(主体、目标、策略、安全上下文) 我们还讲到: 对于受 SELinux 管制的进程,会先…...
函数(个人学习笔记黑马学习)
1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…...
《Flink学习笔记》——第五章 DataStream API
一个Flink程序,其实就是对DataStream的各种转换,代码基本可以由以下几部分构成: 获取执行环境读取数据源定义对DataStream的转换操作输出触发程序执行 获取执行环境和触发程序执行都属于对执行环境的操作,那么其构成可以用下图表示…...
Vue3.0 新特性以及使用变更总结
Vue3.0 在2020年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。 图片.png 为什么要升级Vue3 使用Vue2.x的小伙伴都熟悉…...
ToBeWritten之VSOC安全运营
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
2023爱分析·一站式通信解决方案市场厂商评估报告:牛信云
[图片] 01 中国企业出海发展背景及阶段 出海背景:出海,对中国企业而言,并不陌生。从最初的贸易型出海,到制造业崛起,再到互联网、移动互联网产业腾飞,中国企业在出海道路上走的越发稳健。行业也从最初的家电…...
微信小程序消防知识每天学平台设计与实现
摘 要 消防是当下一个人都需要在日常生活中所高度重视的事项。消防安全关系到居民的日常生活的安全,通过学习消防知识能够提升人们在日常生活中对于灾难的防范。通过对当下的大学生进行调查研究后发现,现在的年轻人在消防意识上比较的单薄,对…...
Oracle跨库访问DBLINK
1. DBLINK的介绍 Oracle在进行跨库访问时,可以创建DBLINK实现,比如要将UAT的表数据灌入开发环境,则可以使用UAT库为数据源,通过DBLINK实现将查出的数据灌入开发库。 简而言之就是在当前数据库中访问另一个数据库中的表中的数据 2…...
【vue3.0 组合式API与选项式API是什么,有什么区别】
vue3.0 组合式API与选项式API是什么 Vue3.0中引入了组合式API(Composition API),同时保留了选项式API(Options API)。两种 API 风格都能够覆盖大部分的应用场景。它们只是同一个底层系统所提供的两套不同的接口。实际…...
React配置代理的5种方法
React配置代理的五种方法的介绍 使用create-react-app的代理配置: 使用场景:适用于使用create-react-app创建的React项目,特别是小型项目或快速原型开发。优点:配置简单,无需额外安装依赖,适合快速开发和简…...
皮卡丘靶场搭建遇到的问题大全
该博客记录我在安装皮卡丘靶场中遇到的一些问题。 1、 phpstudy_pro启动Mysql失败 自己电脑开启了mysql服务,使用winr,services.msc,找到自己的mysql服务,关闭。再次尝试使用phpstudy_pro启动mysql,成功解决。 2、皮…...
【C++】C++11的新特性(上)
引入 C11作为C标准的一个重要版本,引入了许多令人振奋的新特性,极大地丰富了这门编程语言的功能和表达能力。本章将为您介绍C11的一些主要变化和改进,为接下来的章节铺垫。 文章目录 引入 一、列表初始化 1、1 {} 初始化 1、2 std::initiali…...
ubuntu学习(四)----文件写入操作编程
1、write函数的详解 ssize_t write(int fd,const void*buf,size_t count); 参数说明: fd:是文件描述符(write所对应的是写,即就是1) buf:通常是一个字符串,需要写入的字符串 count:是每次写入的字节数…...
如何解决MySQL中的套接字错误
MySQL通过使用** socket文件**来管理到数据库服务器的连接,socket文件是一种特殊的文件,可以促进不同进程之间的通信。MySQL服务器的套接字文件名为mysqld.sock,在Ubuntu系统中,它通常存储在/var/run/mysqld/目录中。该文件由MySQ…...
socket
Socket是一种用于网络通信的编程接口,它提供了在计算机网络中进行数据传输的方法。通过Socket,可以在不同主机之间建立网络连接,并通过发送和接收数据来进行通信。在C语言中,可以使用Socket函数库(如BSD Socket或Winso…...
Python数据分析实战-判断一组序列(列表)的变化趋势(附源码和实现效果)
实现功能 判断一组序列(列表)的变化趋势 实现代码 from sklearn.linear_model import LinearRegression import numpy as np # 计算相邻两个数之间的差值的均值,并判断变化趋势。 def trend(lst):diff [lst[i1] - lst[i] for i in range(…...
Spring与MyBatis集成 AOP整合PageHelper插件
目录 1.什么是集成? 2.Spring与MyBatis集成 3.Spring与MyBatis集成的基本配置 4.AOP整合PageHelper插件 1.什么是集成? 集成是指将不同的组件、框架或系统整合到一起,使它们可以协同工作、相互调用、共享资源等。通过集成,可以…...
[Android 四大组件] --- BroadcastReceiver
1 BroadcastReceiver是什么 BroadcastReceiver(广播接收器)即广播,是一个全局的监听器。 Android 广播分为两个角色:广播发送者、广播接受者。 2 广播类型 广播按照类型分为两种,一种是全局广播,另一种…...
<C++> STL_容器适配器
1.容器适配器 适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。 容器适配器是STL中的一种重要组件,用于提供不同的数据结构接口,以满足特定的需求和限制。容器适配器是基于其他STL容器构建的,通过…...
【25考研】- 整体规划及高数一起步
【25考研】- 整体规划及高数一起步 一、整体规划二、专业课870计算机应用基础参考网上考研学长学姐: 三、高数一典型题目、易错点及常用结论(一)典型题目(二)易错点(三)常用结论1.令tarctanx, 则…...
【Unity】常见的角色移动旋转
在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式: 欧拉角(Euler Angles):欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Un…...
今天的小结
1、冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序的元素列表,比较相邻的元素并交换它们的位置,直到整个列表排序完成。冒泡排序的基本思想是通过不断交换相邻元素,将最大&#…...
了解 Socks 协议:它的过去、现在与未来
在网络世界的江湖中,有一名叫做 Socks 协议的高手,它凭借着一招“代理”绝技,在网络安全领域独步天下。今天,就让我们来了解一下这位神秘高手的过去、现在和未来。 在过去,互联网世界的江湖可谓是风起云涌,…...
小谈静态类和单例模式
静态类(Static Class)和单例(Singleton)都是在编程中用于实现特定类型的设计模式或代码组织方式。它们在不同的情境下有不同的用途和特点。 静态类(Static Class) 静态类是一种类,它的方法和属…...
LeetCode解法汇总823. 带因子的二叉树
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给出一个含…...
TypeScript的变量声明的各种方式
TypeScript是一种静态类型的JavaScript超集,它为JavaScript代码提供了类型检查和更好的代码组织结构。在TypeScript中,变量声明是非常重要的,因为它们定义了变量的类型和范围。本文将详细介绍TypeScript的变量声明,并通过代码案例…...
c++ lambda
Lambda Lambda 表达式一般用于定义匿名函数,使得代码更加灵活简洁,优点: 声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可…...
泊松回归和地理加权泊松回归
01 泊松回归 泊松回归(Poisson Regression)是一种广义线性模型,用于建立离散型响应变量(计数数据)与一个或多个预测变量之间的关系。它以法国数学家西蒙丹尼泊松(Simon Denis Poisson)的名字命名,适用于计算“事件发生次数”的概率,比如交通事故发生次数、产品缺陷数…...
【数学建模竞赛】各类题型及解题方案
评价类赛题建模流程及总结 建模步骤 建立评价指标->评价体系->同向化处理(都越多越好或越少越少)->指标无量纲处理 ->权重-> 主客观->合成 主客观评价问题的区别 主客观概念主要是在指标定权时来划分的。主观评价与客观评价的区别…...
【12期】谈一谈redis两种持久化机制的区别?
Redis两类持续性的方法 RDB方案可以在规定时间间隔内创建数据集的时间点快照。 AOF方案记录了服务器执行的所有写操作命令,并在服务器启动时通过重新执行这些命令来还原数据集。AOF文件完全遵循Redis协议格式保存,新命令会被追加到文件末尾。此外&#…...
Lambda 编程(Kotlin)一
学习记录,以下为个人理解 知识点: Lambda的定义:允许你把代码块当作参数传递给函数Lambda的语法约定:如果lambda 表达式是函数调用的最后一个实参,它可以放到括号的外边当lambda表达式时函数唯一的实参时,…...
网络字节序——TCP接口及其实现简单TCP服务器
网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版:客户端串行版2. 多进程版:客户端并行版netstat查看网络信息3.多线程版:并行执行log.hpp 守护进程fg、bg s…...
RxJS如何根据事件创建Observable对象?
RxJS提供了一些用来创建Observable对象的函数,我们可以根据事件、定时器、Promise,AJAX等来创建Observable对象。 下面是根据事件创建Observable对象的几个例子。 this.outsideClick$ fromEvent(document, click).subscribe((event: MouseEvent) > …...
网站常见安全漏洞 | 青训营
Powered by:NEFU AB-IN 文章目录 网站常见安全漏洞 | 青训营 网站基本组成及漏洞定义服务端漏洞SQL注入命令执行越权漏洞SSRF文件上传漏洞 客户端漏洞开放重定向XSSCSRF点击劫持CORS跨域配置错误WebSocket 网站常见安全漏洞 | 青训营 网站常见安全漏洞-网站基本组成及漏洞定义…...
vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图
效果图: vis组件库:vis.js vis-network中文文档:vis-network 安装组件库: npm install vis-network vue-vis-network 或 yarn add vis-network vue-vis-network 新建RelationGraph.vue文件: <template><…...
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。
LeetCode第73题矩阵置零 1.思路: 想到一个开辟一点空间来解决方法,使用哈希集。就是使用一个哈希集(row和col)来储存数组中的元素为0的下标。然后再遍历,整个二维数组,在哈希集中存在对应的下标,…...
java-初识Servlet,Tomcat,JDBC
文章目录 前言一、ServletServlet 生命周期Servlet 实例Servlet 过滤器 二、TomcatJDBCJDBC连接数据库实例 总结 前言 java入门须知的重要概念/名词/技术 等 一、Servlet Servlet是Java Web开发中的一个核心组件,它是基于Java语言编写的服务器端程序,…...
SpringBoot+mybatis+pgsql多个数据源配置
一、配置文件 jdk环境:1.8 配置了双数据源springbootdruidpgsql,application.properties配置修改如下: #当前入库主数据库 spring.primary.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.primary.datasource.driver-class…...
视频汇聚/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流&#…...
MQ消息队列(主要介绍RabbitMQ)
消息队列概念:是在消息的传输过程中保存消息的容器。 作用:异步处理、应用解耦、流量控制..... RabbitMQ: SpringBoot继承RabbitMQ步骤: 1.加入依赖 <dependency><groupId>org.springframework.boot</groupId&g…...
2023年7月天猫糕点市场数据分析(天猫数据怎么看)
烘焙食品行业是近几年食品领域比较火热的赛道之一,随着居民饮食结构的变化,人均消费水平的上升,蛋糕、面包等烘焙糕点越发成为消费者饮食的重要组成部分。同时,在烘焙糕点市场中,老品牌不断推新迭变,新品牌…...
开源双语对话语言模型 ChatGLM-6B 本地私有化部署
本文首发于:https://www.licorne.ink/2023/08/llm-chatglm-6b-local-deploy/ ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级…...
Zabbix 5.0 媒体介质 邮箱配置例子
QQ企业邮箱 参考:zabbix 腾讯企业邮箱配置图_harveymomo的博客-CSDN博客...
基于Red Hat Enterprise Linux 7操作系统的PostgresSql15的备份恢复(实践笔记)
零、前言 本文是基于阿里云ECS服务器进行的实践操作,操作系统版本:Red Hat Enterprise Linux 7 PG数据库版本:PostgresSql 15 PG安装方式:yum 由于本人新接触pg数据,本次也是出于好奇,就对pg数据库的pg_du…...