Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

学习目标

前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入)

能够配置setter方式注入属性值

能够配置构造方式注入属性值

能够理解什么是自动装配

一、依赖注入(DI配置)

1 依赖注入方式【重点】

思考:向一个类中传递数据的方式有几种?(给类中的属性赋值)

  • setter方法

  • 构造方法

思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,注入数据类型有哪些?

  • 简单类型=八种基本数据类型+String

  • 引用类型

1.1 依赖注入的两种方式

  • setter注入
    • 简单类型

    • 引用类型(很常用)

  • 构造器注入
    • 简单类型

    • 引用类型

2 setter方式注入

思考:setter方式注入使用什么子标签?

property标签: 调用set方法赋值

name: 成员变量名, 准确来说对应set方法名,首字母大写

value: 对简单类型的成员变量赋值

ref: 对引用类型的成员变量赋值

2.1简单类型setter注入

格式:

<!-- property标签: 调用set方法赋值name: 成员变量名, 准确来说对应set方法名,首字母大写value: 对简单类型的成员变量赋值 -->
<property name="age" value="20"></property>

2.2 引用类型setter注入

格式:

<!--property标签: 调用set方法赋值name: 成员变量名, 准确来说对应set方法名,首字母大写ref: 对引用类型的成员变量赋值, 引用的对象 -->
<property name="studentDao" ref="studentDao">
</property>

2.3 setter注入代码实现

【第0步】创建项目
【第1步】导入Spring坐标
【第2步】导入Student实体类
【第3步】定义Spring管理的类(接口)
【第4步】创建Spring配置文件在resources目录下创建`application.xml`,配置setter的简单类型
【第5步】在test目录下创建`StudentServiceTest`,进行测试
【第6步】在`application.xml`,配置对应引用类型注入
【第7步】测试

【第0步】创建项目

【第1步】导入Spring坐标

  <dependencies><!--导入spring的坐标spring-context,对应版本是5.2.10.RELEASE--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.15</version></dependency><!-- 导入junit的测试包 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies>

【第2步】导入Student实体类

@Data
@ToString
@AllArgsConstructor
public class Student {private String name;private String address;private Integer age;private Integer status;
}

【第3步】定义Spring管理的类(接口)

  • StudentDao接口和StudentDaoImpl实现类用于简单类型注入

package com.zbbmeta.dao;public interface StudentDao {/*** 添加学生*/void save();
}
public class StudentDaoImpl implements StudentDao {//简单类型属性private Integer age;public void setAge(Integer age) {this.age = age;}@Overridepublic void save() {System.out.println("DAO: 年龄:"+this.age);System.out.println("DAO: 添加学生信息到数据库...");}
}
  • StudentService接口和StudentServiceImpl实现类用于引用类型注入

package com.zbbmeta.service;public interface StudentService {/*** 添加学生*/void save();
}
package com.zbbmeta.service.impl;import com.zbbmeta.dao.StudentDao;
import com.zbbmeta.service.StudentService;public class StudentServiceImpl implements StudentService {//创建成员对象private StudentDao studentDao ;//提供依赖对象对应的setter方法public void setStudentDao(StudentDao studentDao) {this.studentDao = studentDao;}@Overridepublic void save() {System.out.println("Service: 添加学生信息到数据库...");studentDao.save();}
}

【第4步】创建Spring配置文件在resources目录下创建application.xml,配置setter的简单类型

  • 定义application.xml文件中创建StudentDao类到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"><!-- 目标:setter简单类型注入--><bean class="com.zbbmeta.dao.impl.StudentDaoImpl" id="studentDao">
<!--        property标签: 调用set方法赋值name: 成员变量名, 准确来说对应set方法名,首字母大写value: 对简单类型的成员变量赋值 --><property name="age" value="20"></property></bean>
</beans>

【第5步】在test目录下创建StudentServiceTest,进行测试

package com.zbbmeta;import com.zbbmeta.dao.StudentDao;
import com.zbbmeta.service.StudentService;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class StudentServiceTest {//目标:测试setter的简单类型的注入@Testpublic void test1(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="bookService"对象StudentDao studentDao = (StudentDao) ac.getBean("studentDao");//3.执行对象方法studentDao.save();//4.关闭容器ac.close();}
  • 控制台结果:

【第6步】在application.xml,配置引用类型注入

    <!-- 目标:setter引用类型注入--><bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService"><!--property标签: 调用set方法赋值name: 成员变量名, 准确来说对应set方法名,首字母大写ref: 对引用类型的成员变量赋值, 引用的对象 --><property name="studentDao" ref="studentDao"></property></bean>

【第7步】测试

    //目标:测试setter的引用类型的注入@Testpublic void test2(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="bookService"对象StudentService studentService = (StudentService) ac.getBean("studentService");//3.执行对象方法studentService.save();//4.关闭容器ac.close();}
  • 控制台结果

3 构造器方式注入

思考:构造方式注入使用什么子标签?

3.1 构造器注入简单类型

格式:配置中使用constructor-arg标签value属性注入简单类型

<!--constructor-arg标签: 调用构造函数方法赋值name: 成员变量名, 准确来说对应构造方法中参数名称value: 简单类型,方法参数对应的值-->
<constructor-arg name="age" value="30"></constructor-arg>

2.2 构造器注入引用类型

格式:配置中使用constructor-arg标签ref属性注入引用类型

<!--constructor-arg标签: 调用构造函数方法赋值name: 成员变量名, 准确来说对应构造方法中参数名称ref: 引用类型,属性注入引用类型对象-->
<constructor-arg name="studentDao" ref="studentDao"></constructor-arg>

3.3 构造器注入代码实现

【第0步】创建`11_2_DI_Construce`项目结构
【第1步】导入依赖坐标
【第2步】导入Student实体类
【第3步】定义Spring管理的类(接口)
【第4步】创建Spring配置文件在resources目录下创建`application.xml`,配置构造器注入简单类型
【第5步】在test目录下创建`StudentServiceTest`,进行测试
【第6步】在`application.xml`,配置构造器注入引用类型
【第7步】测试

【第0步】创建11_2_DI_Construce项目结构

【第1步】导入依赖坐标

和之前项目依赖一致

【第2步】导入Student实体类

和之前一致

【第3步】定义Spring管理的类(接口)

  • StudentDao接口和StudentDaoImpl实现类实现构造器注入简单类型

package com.zbbmeta.dao;public interface StudentDao {/*** 添加学生*/void save();
}
package com.zbbmeta.dao.impl;import com.zbbmeta.dao.StudentDao;public class StudentDaoImpl implements StudentDao {//简单类型属性private Integer age;public StudentDaoImpl(Integer age){System.out.println("DAO: 注入简单类型 age");this.age =age;}@Overridepublic void save() {System.out.println("DAO: 年龄:"+this.age);System.out.println("DAO: 添加学生信息到数据库...");}
}
  • StudentService接口和StudentServiceImpl实现类实现构造器注入引用类型

package com.zbbmeta.service;public interface StudentService {/*** 添加学生*/void save();
}
package com.zbbmeta.service.impl;import com.zbbmeta.dao.StudentDao;
import com.zbbmeta.service.StudentService;public class StudentServiceImpl implements StudentService {//创建成员对象private StudentDao studentDao ;public StudentServiceImpl(StudentDao studentDao){System.out.println("StudentService: 注入引用类型studentDao");this.studentDao =studentDao;}@Overridepublic void save() {System.out.println("Service: 添加学生信息到数据库...");studentDao.save();}
}

【第4步】创建Spring配置文件在resources目录下创建application.xml,配置构造器注入简单类型

  • 定义application.xml配置文件并配置StudentDaoImpl实现构造器注入简单类型

<?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 class="com.zbbmeta.dao.impl.StudentDaoImpl" id="studentDao"><!--constructor-arg标签: 调用构造函数方法赋值name: 成员变量名, 准确来说对应构造方法中参数名称value: 简单类型,方法参数对应的值--><constructor-arg name="age" value="30"></constructor-arg></bean>
</beans>

【第5步】在test目录下创建StudentServiceTest,进行测试

package com.zbbmeta;import com.zbbmeta.dao.StudentDao;
import com.zbbmeta.service.StudentService;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class StudentServiceTest {//目标:测试构造器的简单类型的注入@Testpublic void test1(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="studentDao"对象StudentDao studentDao = (StudentDao) ac.getBean("studentDao");//3.执行对象方法studentDao.save();//4.关闭容器ac.close();}
}
  • 控制台结果:

**【第6步】在application.xml,配置构造器注入引用类型 **

<!-- 目标:构造器依赖注入引用类型【了解】-->
<bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService"><!--constructor-arg标签: 调用构造函数方法赋值name: 成员变量名, 准确来说对应构造方法中参数名称ref: 引用类型,属性注入引用类型对象--><constructor-arg name="studentDao" ref="studentDao"></constructor-arg>
</bean>

【第7步】测试

    //目标:测试setter的引用类型的注入@Testpublic void test2(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="bookService"对象StudentService studentService = (StudentService) ac.getBean("studentService");//3.执行对象方法studentService.save();//4.关闭容器ac.close();}
  • 控制台结果

4 依赖自动装配【理解】

4.1 自动装配概念

  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

  • 自动装配方式
    • 按类型

    • 按名称

    • 按构造方法

autowire: 自动装配, 在容器中找对应对象,自动给成员变量赋值byType: 通过类型注入byName: 通过名字注入constructor: 通过构造器注入no: 不自动注入

4.2 自动装配类型

4.2.1 依赖类型自动装配

配置中使用bean标签autowire属性设置自动装配的类型byType

使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用

格式:

<!--给成员变量赋值autowire: 自动装配, 在容器中找对应对象,自动给成员变量赋值byType: 通过类型注入byName: 通过名字注入constructor: 通过构造器注入no: 不自动注入
-->
<bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService" autowire="byType">
</bean>

4.2.2依赖bean容器名字自动装配

配置中使用bean标签autowire属性设置自动装配的类型byName

使用按名称装配时(byName)必须保障容器中具有指定名称的bean,不推荐使用

<!--
autowire="byType" 根据成员属性名自动注入
-->
<bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService2" autowire="byName">
</bean>

4.2.3 依赖bean容器根据构造器自动装配注入

配置中使用bean标签autowire属性设置自动装配的类型constructor

<!--
autowire="constructor" 
据成员的所属类型去IOC容器中查找一样类型的对象进行调用构造函数进行给成员赋值
-->
<bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService3" autowire="constructor">
</bean>

4.3 依赖自动装配代码实现

【第0步】创建11_2_DI_Autowire项目
【第1步】导入依赖坐标
【第2步】导入Student实体类
【第3步】定义Spring管理的类(接口)
【第4步】创建Spring配置文件在resources目录下创建`application.xml`
【第5步】在test目录下创建`StudentServiceTest`

【第0步】创建11_2_DI_Autowire项目

【第1步】导入Spring坐标

和之前项目依赖一致

【第1步】导入依赖坐标

和之前一致

【第3步】定义Spring管理的类(接口)

  • StudentDao接口和StudentDaoImpl实现类

package com.zbbmeta.dao;public interface StudentDao {/*** 添加学生*/void save();
}
package com.zbbmeta.dao.impl;import com.zbbmeta.dao.StudentDao;public class StudentDaoImpl implements StudentDao {@Overridepublic void save() {System.out.println("DAO: 添加学生信息到数据库...");}
}
  • StudentService接口和StudentServiceImpl实现类

package com.zbbmeta.service;public interface StudentService {/*** 添加学生*/void save();
}
package com.zbbmeta.service.impl;import com.zbbmeta.dao.StudentDao;
import com.zbbmeta.service.StudentService;public class StudentServiceImpl implements StudentService {//创建成员对象private StudentDao studentDao ;//提供依赖对象对应的setter方法public void setStudentDao(StudentDao studentDao)     {this.studentDao = studentDao;}//构造函数StudentServiceImpl(){}public StudentServiceImpl(StudentDao studentDao)    {System.out.println("Service 构造器方法");this.studentDao=studentDao;}@Overridepublic void save() {System.out.println("Service: 添加学生信息到数据库...");studentDao.save();}
}

【第4步】创建Spring配置文件在resources目录下创建application.xml

  • 定义application.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 class="com.zbbmeta.dao.impl.StudentDaoImpl" id="studentDao"></bean><!--autowire="byType" 根据类型自动注入【重点】成员属性:private StudentDao studentDao ;  根据成员的所属类型去IOC容器中查找一样类型的对象进行调用成员的setStudentDao(参数)注入数据--><bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService" autowire="byType"></bean><!--
autowire="byName" 根据成员属性名自动注入
成员属性:private StudentDao studentDao ;  根据成员的属性名字去IOC容器中查找一样名称的对象进行调用成员的setStudentDao(参数)注入数据--><bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService2" autowire="byName"></bean><!--autowire="constructor" 成员属性:private StudentDao studentDao构造函数:public StudentServiceImpl(StudentDao studentDao){this.studentDao = studentDao;}据成员的所属类型去IOC容器中查找一样类型的对象进行调用构造函数进行给成员赋值--><bean class="com.zbbmeta.service.impl.StudentServiceImpl" id="studentService3" autowire="constructor"></bean>
</beans>

**【第5步】在test目录下创建StudentServiceTest进行测试

package com.zbbmeta;import com.zbbmeta.dao.StudentDao;
import com.zbbmeta.service.StudentService;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class StudentServiceTest {//目标:根据类型自动注入@Testpublic void test1(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="studentService"对象StudentService studentService = (StudentService) ac.getBean("studentService");//3.执行对象方法studentService.save();//4.关闭容器ac.close();}//目标:测试自动注入根据名称查找注入@Testpublic void test2(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="bookService"对象StudentService studentService = (StudentService) ac.getBean("studentService2");//3.执行对象方法studentService.save();//4.关闭容器ac.close();}//目标:测试构造器根据名称查找注入@Testpublic void test3(){//1.根据配置文件application.xml创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");//2.从IOC容器里面获取id="bookService"对象StudentService studentService = (StudentService) ac.getBean("studentService3");//3.执行对象方法studentService.save();//4.关闭容器ac.close();}
}

5 集合注入

5.1 注入数组类型数据

格式:

<!--调用setArray方法给成员array赋值-->
<property name="array"><array><!--new String("数据") 引用类型赋值--><bean class="java.lang.String" id="s"><constructor-arg value="100"></constructor-arg></bean><!--简单类型赋值--><value>200</value><value>300</value></array>
</property>

5.2 注入List类型数据

格式:

<!--调用setList方法给成员list赋值-->
<property name="list"><list><value>张三</value><value>李四</value><value>王五</value></list>
</property>

5.3 注入Set类型数据

格式:

<!--调用setSet方法给成员set赋值-->
<property name="set"><set><value>珠海</value><value>江门</value><value>惠州</value></set>
</property>

5.4 注入Map类型数据

<!--调用setMap方法给成员map赋值-->
<property name="map"><map><entry key="country" value="china"></entry><entry key="province" value="广东"></entry><entry key="city" value="广州"></entry></map>
</property>

5.5 注入Properties类型数据

<!--调用setMap方法给成员map赋值-->
<property name="properties"><props><prop key="country">china</prop><prop key="province">广东</prop><prop key="city">广州</prop></props>
</property>

说明:property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签

5.6 集合注入完整代码

【第0步】在11_3_DI_Autowired的entity包下创建Person类
【第1步】创建Spring配置文件在resources目录下创建`application-person.xml`
【第2步】在test目录下创建`PersonTest`

【第0步】在11_3_DI_Autowired的entity包下创建Person类

package com.zbbmeta.entity;import java.util.*;public class Person {private String[] array;private List<String> list;private Set<String> set;private Map<String,Object> map;private Properties properties;public Person() {}public Person(String[] array, List<String> list, Set<String> set, Map<String, Object> map, Properties properties) {this.array = array;this.list = list;this.set = set;this.map = map;this.properties = properties;}/*** 获取* @return array*/public String[] getArray() {return array;}/*** 设置* @param array*/public void setArray(String[] array) {this.array = array;}/*** 获取* @return list*/public List<String> getList() {return list;}/*** 设置* @param list*/public void setList(List<String> list) {this.list = list;}/*** 获取* @return set*/public Set<String> getSet() {return set;}/*** 设置* @param set*/public void setSet(Set<String> set) {this.set = set;}/*** 获取* @return map*/public Map<String, Object> getMap() {return map;}/*** 设置* @param map*/public void setMap(Map<String, Object> map) {this.map = map;}/*** 获取* @return properties*/public Properties getProperties() {return properties;}/*** 设置* @param properties*/public void setProperties(Properties properties) {this.properties = properties;}@Overridepublic String toString() {return "User{" +"array=" + Arrays.toString(array) +", list=" + list +", set=" + set +", map=" + map +", properties=" + properties +'}';}
}

【第1步】创建Spring配置文件在resources目录下创建application-person.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"><!--目标:创建User对象并依赖注入赋值--><bean class="com.zbbmeta.entity.Person" id="person"><!--调用setArray方法给成员array赋值--><property name="array"><array><!--new String("数据") 引用类型赋值--><bean class="java.lang.String" id="s"><constructor-arg value="100"></constructor-arg></bean><!--简单类型赋值--><value>200</value><value>300</value></array></property><!--调用setList方法给成员list赋值--><property name="list"><list><value>张三</value><value>李四</value><value>王五</value></list></property><!--调用setSet方法给成员set赋值--><property name="set"><set><value>珠海</value><value>江门</value><value>惠州</value></set></property><!--调用setMap方法给成员map赋值--><property name="map"><map><entry key="country" value="china"></entry><entry key="province" value="广东"></entry><entry key="city" value="广州"></entry></map></property><!--调用setMap方法给成员map赋值--><property name="properties"><props><prop key="country">china</prop><prop key="province">广东</prop><prop key="city">广州</prop></props></property></bean>
</beans>

【第2步】在test目录下创建PersonTest

package com.zbbmeta;import com.zbbmeta.entity.Person;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class PersonTest {@Testpublic void test(){//1.创建IOC容器ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application-person.xml");//2.获取对象Person person = ac.getBean(Person.class); //根据指定类型去IOC容器中查找对象//3.打印对象System.out.println(person);//4.关闭容器ac.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/87060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TFN 新推出信息安全产品 ,手机安全(插卡监听器)探测器 FW5 反窃听数字协议无线探测器

本产品是新研制的检测设备&#xff0c;工程师或反监测专家把它作为一个可靠的工具&#xff0c;用来 跟踪各种无线电数字传输设备&#xff0c;例如 GSM 、蓝牙等新型视听设备。随着现代科学技术 的不断发展&#xff0c;不同的数字传输方式已在我们的生活中得到了广泛的应用。例…

pytest fixture 常用参数

fixture 常用的参数 参数一&#xff1a;autouse&#xff0c;作用&#xff1a;自动运行&#xff0c;无需调用 举例一&#xff1a;我们在类中定义一个function 范围的fixture; 设置它自动执行autouseTrue&#xff0c;那么我们看下它执行结果 输出&#xff1a; 说明&#xff1a;…

EXPLAIN使用分析

系列文章目录 文章目录 系列文章目录一、type说明二、MySQL中使用Show Profile1.查看当前profiling配置2.在会话级别修改profiling配置3.查看profile记录4.要深入查看某条查询执行时间的分布 一、type说明 我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引&…

3个月快速入门LoRa物联网传感器开发

在这里插入图片描述 快速入门LoRa物联网传感器开发 LoRa作为一种LPWAN(低功耗广域网络)无线通信技术,非常适合物联网传感器和行业应用。要快速掌握LoRa开发,需要系统学习理论知识,并通过实际项目积累经验。 摘要: 先学习LoRa基础知识:原理、网络架构、协议等,大概需要2周时间…

基于Flask的模型部署

基于Flask的模型部署 一、背景 Flask&#xff1a;一个使用Python编写的轻量级Web应用程序框架&#xff1b; 首先需要明确模型部署的两种方式&#xff1a;在线和离线&#xff1b; 在线&#xff1a;就是将模型部署到类似于服务器上&#xff0c;调用需要通过网络传输数据&…

YOLOv5基础知识入门(5)— 损失函数(IoU、GIoU、DIoU、CIoU和EIoU)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。使用YOLOv5训练模型阶段&#xff0c;需要用到损失函数。损失函数是用来衡量模型预测值和真实值不一样的程度&#xff0c;极大程度上决定了模型的性能。本节就给大家介绍IoU系列损失函数&#xff0c;希望大家学习之后能够有…

数据结构刷题训练——链表篇(三)

目录 文章目录 前言 1. 题目一&#xff1a;环形链表Ⅱ 1.1 思路 1.2 分析 1.3 题解 1.4 方法二 2. 题目二&#xff1a;复制带随机指针的链表 2.1 思路 2.2 分析 2.3 题解 总结 前言 在这个专栏博客中&#xff0c;我们将提供丰富的题目资源和解题思路&#xff0c;帮助读者逐步提…

什么是React?React与VU的优缺点有哪些?

什么是React&#xff1f;什么是VUE&#xff1f; 维基百科上的概念解释&#xff0c;Vue.js是一个用于创建用户界面的开源MVVM前端JavaScript框架&#xff0c;也是一个创建单页应用的Web应用框架。Vue.js由尤雨溪&#xff08;Evan You&#xff09;创建&#xff0c;由他和其他活跃…

探究使用HTTP代理ip后无法访问网站的原因与解决方案

目录 访问网站的原理是什么 1. DNS解析 2. 建立TCP连接 3. 发送HTTP请求&#xff1a; 4. 服务器响应&#xff1a; 5. 浏览器渲染&#xff1a; 6. 页面展示&#xff1a; 使用代理IP后访问不了网站&#xff0c;有哪些方面的原因 1. 代理IP的可用性&#xff1a; 2. 代理…

在单元测试中使用Jest模拟VS Code extension API

对VS Code extension进行单元测试时通常会遇到一个问题&#xff0c;代码中所使用的VS Code编辑器的功能都依赖于vscode库&#xff0c;但是我们在单元测试中并没有添加对vscode库的依赖&#xff0c;所以导致运行单元测试时出错。由于vscode库是作为第三方依赖被引入到我们的VS C…

3.1 Spring MVC概述

1. MVC概念 MVC是一种编程思想&#xff0c;它将应用分为模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三个层次&#xff0c;这三部分以最低的耦合进行协同工作&#xff0c;从而提高应用的可扩展性及可维护…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构&#xff0c;参数化配置是一个非常重要的点&#xff0c;而Netflix也开源了一个叫变色龙Archaius的配置中心客户端&#xff0c;而且Archaius可以说是比其他客户端具备更多生产级特性&#xff0c;也更灵活。*在NetflixOSS微服务技术栈…

资源限制类题目解法,看这一篇就够了!

算法拾遗三十七资源限制类题目 资源限制技巧汇总32位无符号整数的范围是0~4,294,967,295&#xff0c;现在有一个正好包含40亿个无符号整数的文件&#xff0c;可以使用最多1GB的内存&#xff0c;怎么找到出现次数最多的数32位无符号整数的范围是0~4294967295&#xff0c;现在又一…

人工智能讲师AIGC讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-2

以下为叶老师讲义分享&#xff1a; P6-P9 一些考验大模型的经典问题: 1、鲁迅与周树人是同一个人吗?2、圆周率的最后一位3、蓝牙耳机坏了4、最新的&#xff1a;奶奶的睡前故事 关于事实的问答结果: 知识的时效性&#xff1a; 未完&#xff0c;下一章继续……

【Unity实战系列】Unity的下载安装以及汉化教程

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;怎么说呢&#xff0c;其实这才是我以后真正想写想做的东西&#xff0c;虽然才刚开始&#xff0c;但好歹&#xff0c;我总算是启程了。今天要分享…

数据库活动监控(DAM)

在当今数据驱动的世界中&#xff0c;组织在保护存储在数据库中的机密数据并确保其完整性方面面临着越来越多的挑战。数据库审计通过提供全面的数据库活动监控方法&#xff0c;在应对这些挑战方面发挥着至关重要的作用。 数据库活动监控&#xff08;Database Activity Monitori…

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯

2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯 https://ac.nowcoder.com/acm/contest/62977/F 文章目录 2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯题意解题思路代码 题意 给定一个…

SpringCloudGateway配置跨域设置以及如何本地测试跨域

问题背景 有个服务A &#xff0c;自身对外提供服务&#xff0c;几个系统的前端页面也在调用&#xff0c;使用springboot 2.6.8开发的&#xff0c;自身因为有前端直接调用已经配置了跨域。 现在有网关服务&#xff0c;一部分前端通过网关访问服务A&#xff08;因为之前没有网关…

预测知识 | 预测技术流程及模型评价

预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价技术流程模型评价参考资料 技术流程 1&#xff09;模型训练阶段&#xff1a;预测因素和结局&#xff0c;再加上预测模型进行模型拟合&#xff1b; 2&#xff09;预测阶段&#xff1a;将预测因素代入拟…

大数据课程I2——Kafka的架构

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的架构&#xff1b; ⚪ 掌握Kafka的Topic与Partition&#xff1b; 一、Kafka核心概念及操作 1. producer生产者&#xff0c;可以是一个测试线程&#xff0c;也…