从头到尾Spring概念,家族,核心技术使用,事务这一篇就够了!!!

news2025/2/3 13:53:24

目录

1.了解Spring家族

家族成员

Spring常用项目介绍

2.Spring Framework体系结构

概述

体系图

3.Spring框架提供的核心技术

IOC控制反转

1.IOC与Spring的关系

2.什么是Bean

DI 依赖注入

IoC/DI技术实现

1.基于XML的实现

2.基于注解的实现

3.基于java的实现

AOP 面向切面编程

1.概述

    1.1没AOP技术时出现的问题:

    1.2作用:

    1.3执行原理:

    1.4 核心概念:

2.切入点表达式

3.AOP的五种增强概念及实现

      3.1 @Before前置增强

      3.2 @AfterReturning 后置增强

      3.3 @Around 环绕增强(重点)

      3.4 @After 最终增强

      3.5 AfterThrowing 异常增强

4.Spring事务

1.概述

2.不开启事务的问题

3.开启事务后

4.开启事务的步骤


1.了解Spring家族

       Spring不单单只能帮助我们做一些简单的开发,它是一个家族,里面包含了多个项目, 完全可以只依靠Spring的情况下,开发任意项目,所以Spring发展到现在已经形成了一种开发的生态圈,提供了若干个项目,每个项目用于完成特定的功能,这些功能通常被称为Spring全家桶

家族成员

Spring常用项目介绍

1.Spring Framework ——Spring项目的根基(底层框架),所有成员都基于该框架实现

2.Spring Boot—— 提高spring开发速度

3.Spring Cloud——分布式开发

4.Spring Data——提供一致的数据访问方法(平时开发一般使用Myabtis进行数据库连接)

想具体了解其他家族成员的具体功能请参考Spring官网 : Spring | Projects

2.Spring Framework体系结构

概述

      Spring FrameWork 是Spring 生态圈中最基础的项目,其他项目都基于它的底层去实现,该项目为依赖关系注入事务管理、Web应用、数据访问、消息传递等提供核心支持

体系图

 俺会将以上的体系图按顺序分为五个模块:

(1) Core Container 核心容器

--    用于spring管理中的bean对象

(2) Aop     Aspects 

--  AOP: 面向切面编程

-- 对设计性概念做了一个落地实现,基于Aspects框架的制作开发了Aop

(3) Data Access/Intergration  

--   数据访问/数据集成(如:Mybatis与Spring的整合)

--   Transcations 事务 重点

(4) Web : 用于Web开发

(5) Test 单元测试与集成测试

3.Spring框架提供的核心技术

-- Spring框架两大核心技术: IoC,AOP

IOC控制反转

-- 问题: 接口直接依赖实现: 不易修改,开发成本高耦合度高

UserDao userdao=new UserDaoImpl();

解决:  IOC(Inversion of Control) 控制反转: 使用对象时,由主动new 产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

1.IOC与Spring的关系

Spring技术对IOC思想进行了实现

-- Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的外部

2.什么是Bean

-- IOC容器负责对象的创建、初始化等一系列工作,被创建或管理的对象在IoC容器中统称为Bean.

DI 依赖注入

问题: 在使用IOC创建对象以后,如果一个对象中依赖了另一个对象,就必须把依赖的对象所实现。

public class UserServiceImpl
{
   //依赖
   private UserDao userdao;
  .......
}

解决: DI (Dependency Injection)依赖注入是为了便于理解在IOC之上提供的一个新概念,这两者是一个技术.

         DI:在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

注入方式:

1.通过set 方法进行注入

2.通过构造方法进行注入

IoC最终实现目标

-- 目标: 解耦

-- 最终效果: 使用对象时不仅可以直接从Ioc容器中获取,并且获取到的bean已经绑定了所有的依赖关系。

IoC/DI技术实现

1.基于XML的实现

-- xml文件作为了一个第三方创建bean的方式。

XML配置文件模板获取:核心技术 (spring.io)

 以角色类为例实现:

Role角色类

/**
 * 角色类
 */

public class Role {


   //姓名
   private String name;
   //内容
   private String content;

    public Role() {

    }

    public Role(String name, String content) {
        this.name = name;
        this.content = content;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String say()
   {
       return  name+":"+content;
   }

}

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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--id:bean 的唯一标识符、class:bean的完全限定名-->
<bean id="role" class="cn.Role">
     <!--使用set注入方式设置属性-->
     <property name="name" value="诸葛亮"/>
     <property name="content" value="从未见过如此厚颜无耻之人!"/>
     <!--使用带参构造方法设置属性 name: 根据名称来查找、index: 根据索引顺序查找 -->
     <constructor-arg name="name" value="诸葛亮"/>
     <constructor-arg index="1" value="从未见过如此厚颜无耻之人!"></constructor-arg>
</bean>
</beans>

测试Test

-- BeanFactoey 创建Bean的工厂(称为Bean工厂)。

-- ApplicationContext  接口对BeanFactory的一个封装,功能更加强大(间接继承BeanFactory),该接口扩展了许多丰富的功能,称为Spring容器(又称IOC容器)。

-- ClassPathXmlApplicationContext: 读取xml配置文件的类

public void Test{


  public static void main(String[] args){

   ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
   //根据id获取bean对象
   Role role = (Role) context.getBean("role");
   System.out.println(role.say());


  }

}

2.基于注解的实现

-- 使用注解配置,开发人员不需要使用 XML 来描述 Bean 连接,而是移动配置 通过使用相关类、方法或 字段声明

自动注册bean的注解:将此注解声明在相关类中,就会将类自动定义成为bean,它的id以首字母小写表示(也可通过value更改id)。

  1. @Component

  2.@Service

  3.@Repository

  4.@Controller

实现自动注入的注解

  1.@Resource(根据方法名称注入)

  2.@Autowired(根据类型注入)

 3.@Qualifier(value)指定注入bean的id (与@Autowired配合使用)

(1)单个类的声明和set注入

@Component
public class Role
{
    private String name;
    private String content;

    @Value("诸葛亮")
    public void setName(String name) {
        this.name = name;
    }
    
    @Value("从未见过如此厚颜无耻之人!")
    public void setContent(String content) {
        this.content = content;
    }
}

单个类的声明和构造注入

@Component
public class Role
{
    private String name;
    private String content;

   public Role(@Value("诸葛亮") String name, @Value("从未见过如此厚颜无耻之人!") String 
   content) {
        this.name = name;
        this.content = content;
    }
} 

单个类Test测试

与XML配置文件测试相同!!!!!

(2)依赖类的自动注入

--  实现StudentSercviceImpl 和StudentDao的自动依赖注入。

StudentServiceImpl类

@Component
public class StudentServiceImpl
{


  private StudentDao studentdao;

  //使用@Resource将dao层实现类自动注入
   @Resource(name="studentdao1")
   private StudentDao studentDao;

   public StudentServiceImpl() {
    
    }

   .....

}

StudentDaoImpl类

//当出现多个dao层实现类时,可以使用value来区分
@Component(value = "studentdao1")
public class StudentDaoImpl implements  StudentDao{
    @Override
    public void getStudents() {
        System.out.println("查询学生");
    }
}

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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
   <!--扫描被声明的注解类-->
   <context:component-scan base-package="service"/>
</beans>

依赖类测试

-- 当StudentServiceImpl实例化时,容器会将这个bean的id变为首字母小写。

public class Test {

    public static void main(String[] args) {

   ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

   StudentServiceImpl studentService = (StudentServiceImpl)context.getBean("studentServiceImpl");
   studentService.getStudents();

    }
}

3.基于java的实现

-- Spring中用java类配置来代替XML配置文件的复杂性,可以声明一个java配置类对bean进行配置,主要用到两个注解@Configuration@bean

涉及注解说明

-- @Configuration : 标记当前类是java Config配置类,完全代替XML文件(描述类)。

-- @Bean:返回对象 将被IOC容器管理注册为bean(描述方法)。

-- @ComponentScan(basePackages={"路径"}): 在java配置文件中扫描指定包路径下的bean

话不多说上代码!!!

--  AnnotationConfigApplicationContext类 用于读取java类的配置.

(1).ApplicationConfig——java配置类

@Configuration
@ComponentScan(basePackages = {"cn"})
public class ApplicationConfig {

    @Bean()
    public Role role(){
        Role role=new Role();
        role.setName("诸葛亮");
        role.setContent("我从未如此厚颜无耻之人!");
        return role;
    }

}

Test测试单个类

   //使用Java配置文件
   ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
   StudentServiceImpl studentService = (StudentServiceImpl) context.getBean("studentServiceImpl");
   studentService.getStudents();

(2).依赖类的java配置

@Configuration
@ComponentScan(basePackages = {"cn"})
public class ApplicationConfig {
    @Bean
    public StudentDao studentDaoOne()
    {
        StudentDao studentDao=new StudentDaoOneImpl();
        return  studentDao;
    }

    @Bean
    public StudentDao studentDaoTwo()
    {
        StudentDao studentDao=new StudentDaoTwoImpl();
        return  studentDao;
    }
   
    //出现多个dao的实现类时,使用@Qualifier标识所注入的实现类
    @Bean
    public StudentService studentService(@Qualifier("studentDaoTwoImpl") StudentDao studentDao)
    {
        StudentServiceImpl studentService=new StudentServiceImpl();
        studentService.setStudentDao(studentDao);
        return  studentService;
    }
}

(3)依赖类实现自动注入

-- 通过@Resource或@Autowired注解可以实现一个自动注入,不需手动注入

  业务类被依赖的StudentDao声明一个@Resource注解:

//声明bean
@Component(value = "studentService")
public class StudentServiceImpl implements StudentService {
    

    //studentDaoOne是此实现类的一个别名,可以通过@Conmopent自己设置
    @Resource(name="studentDaoOne")
    private StudentDao studentDao;

    public StudentServiceImpl() {
    }

    .....省略get set

}

java配置类可以省略set注入方法:

@Configuration
//扫描bean
@ComponentScan(basePackages = {"cn"})
public class ApplicationConfig {


    @Bean
    public StudentDao studentDaoOne()
    {
        StudentDao studentDao=new studentDaoOneImpl();
        return  studentDao;
    }

    @Bean
    public StudentDao studentDaoTwo()
    {
        StudentDao studentDao=new studentDaoTwoImpl();
        return  studentDao;
    }


    /**
     * 
     * 省略手动注入的此方法
     */
//    @Bean
//    public StudentService studentService(@Qualifier("studentDaoOne") StudentDao studentDao)
//    {
//        StudentServiceImpl studentService=new StudentServiceImpl();
//        studentService.setStudentDao(studentDao);
//        return  studentService;
//    }
}

依赖类测试跟上述单个类一样!!!!

AOP 面向切面编程

1.概述

    AOP全称Aspect Oriented Programming (面向切面/方面编程),是对oop编程的一种补充,基于IOC容器实现。

1.1没AOP技术时出现的问题:

     当多个方法中都需要开关闭事务/或同样的代码调用,需要重复调用,在原位置上可能会有影响,重复调用,工作量加重。

1.2作用:

    在不惊动原始设计的基础上为其功能增强,自动根据指定的方法位置插入共用代码。

1.3执行原理:

     将共用的代码进行封装,利用动态代理AOP去自动调用, 便于减少系统的重复代码,降低模块间的耦合度。

1.4 核心概念:

  1. 代理(Proxy) : SpringAOP的核心本质是采用代理模式实现的。

  2. 连接点(JoinPoint):在SpringAOP中,理解为任意方法的执行

  3. 切入点(Ponitcut): 匹配连接点的公式,也是具有共性功能的方法描述

  4. 通知/增强(Advice): 若干个方法的共性功能,在切入点处执行,最终体现为一个方法

  5. 切面(Aspect) 描述增强与切入点的对应关系。

  6. 目标对象(Target): 被代理的原始对象成为目标对象

  7. AOP proxy(AOP动态代理): 把切面织入到一个目标对象然后动态产生出一个代理类

  8. Weaving(织入) : 将增强处理连接到程序中的类型或目标对象上的过程。

2.切入点表达式

-- 切入点:要进行增强的方法

-- 切入点表达式: 要进行增强的方法的描述方式。

-- 切入点表达式标准格式 :切入点描述符(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名)

3.AOP的五种增强概念及实现

-- 这里使用java代码注解来实现AOP处理!!!!

-- 想了解XML是如何实现AOP的请参考官网Core Technologies

定义切面的前置操作:

  1.@Aspect声明注解——表示此类用于AOP实现

  2.@Commopent声明注解——由Spring容器来管理此bean

  3.@Order——出现多个切面类时,定义增强执行的优先级(属性值越小优先级越高)

  4.定义一个公共切入点:

@Aspect
@Component
@Order(1)
public class StudentAdvice  {

  //配置公共切入点,使用execution切入描述符 
   @Pointcut("execution(* service.StudentService.findAllStudents(..))")
   public void pointcut() {}
  //忽略增强操作....

}

 java 配置类增加注解:

  1.@EnableAspectJAutoProxy——表示此配置类的AOP是由注解实现的

//标记该类是一个配置类
@Configuration
//扫描指定包下的bean/扫描切面类
@ComponentScan(basePackages = {"service","acvide"})
//声明该类的AOP是由注解实现的
@EnableAspectJAutoProxy
public class ApplicationConfig {
   ......
}

增强示例:通过findAllStudent()查询所有学生目标方法来对它进行一系列的增强操作!!!!!!

该示例的目标方法:

/**
 * 业务实现类
 /
@Service
public class StudentService {

    private static List<Student> studentList=new ArrayList<>();
    static
    {
        studentList.add(new Student(1,"张三",18,"男"));
        studentList.add(new Student(2,"李四",20,"男"));
        studentList.add(new Student(3,"马五",18,"女"));
    }

    /**
     * 查找所有学生
     * @return
     */
    public List<Student> findAllStudents()
    {
        System.out.println("学生信息......");
        return  studentList;
    }

   .......
}

3.1 @Before前置增强

--  设置当前通知方法(增强逻辑)与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行。

示例

 //引入切入点
 @Before("pointcut()")
  public void before()
  {
     System.out.println("开始查询所有学生...");
  }

测试

 ApplicationContext context = new 
 AnnotationConfigApplicationContext(ApplicationConfig.class);
 StudentService service = (StudentService) context.getBean("studentService");
 List<Student> allStudents = service.findAllStudents();

结果

开始查询所有学生...
学生信息......

3.2 @AfterReturning 后置增强

-- 设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法正常执行完毕后运行。

示例

 @AfterReturning("pointcut()")
  public void afterReturning()
  {
     System.out.println("查询所有学生结束....");
  }

结果

学生信息......
查询所有学生结束....

3.3 @Around 环绕增强(重点)

-- 设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后运行。

错误示例

   @Around("pointcut()")
   public void Around()
    {
        System.out.println("开始查询学生...");
        System.out.println("查询所有学生结束...");
    }

错误示例执行结果

开始查询学生...
查询所有学生结束...

原因:通知中如果未使用ProceedingJoinPoint对原始方法进行调用,将跳过原始方法的执行

正确示例

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("开始查询学生...");
        //指定目标方法里原始代码的位置
        Object proceed = pjp.proceed();
        System.out.println("查询所有学生结束...");
        return  proceed;
    }

正确结果

开始查询学生...
学生信息......
查询所有学生结束...

@Around注意事项!!!!

  1.环绕增强必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现方法调用前后同时添加增强

  2.对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Object类型

  3.由于无法预知原始方法运行后是否会抛出异常,因此环绕方法必须抛出Throwable对象。

3.4 @After 最终增强

-- 当前通知方法在原始切入点方法中不论是否出现异常都会执行。

示例

  @After("pointcut()")
    public void after()
    {
        System.out.println("查询学生结束....");
    }

业务类查询方法增加异常

 public List<Student> findAllStudents()
    {
        System.out.println("学生信息......");
        int i=1/0;
        return  studentList;
    }

最终结果

学生信息......
查询学生结束....
Exception in thread "main" java.lang.ArithmeticException: / by zero..............

3.5 AfterThrowing 异常增强

-- 当前通知方法在原始切入点方法运行抛出异常后执行。

示例

@AfterThrowing("pointcut()")
    public void afterThrowing()
    {
        System.out.println("发生异常啦!!");
    }

执行结果

学生信息......
发生异常啦!!
Exception in thread "main" java.lang.ArithmeticException: / by zero

注意:该增强出现异常后才会被执行!!!

4.Spring事务

1.概述

-- 事务 :指一般是指要做的或所做的事情,分为自动事务或手动事务。

-- Spring事务作用: 在数据层或业务层保障一系列的数据库操作同成功同失败。

2.不开启事务的问题

-- 如转账操作: A 加钱  B 减钱,如果加钱的业务操作语句出错,B的减钱操作依旧会执行,前提是A和B在同一个事务中。

3.开启事务后

-- 同一个事务的sql语句,同成功同失败。

4.开启事务的步骤

1.DataSourceTranscationManager(JDBC提供的事务) : 定义事务管理器(在Spring配置文件中或java类中)

 基于xml的配置

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--依赖数据源-->
        <property name="dataSource" ref="dataSource"/>
 </bean>

基于java的配置

  @Bean
  public DataSourceTransactionManager  transactionManager(DataSource dataSource) {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return  transactionManager;
    }

2.@EnableTranscationManager 告诉事务是注解形式

/**
 * java配置类
 */
@Configuration
//告诉事务是注解形式,将事务通过aop织入到目标方法上
@EnableTranscationManager
@Component 
@ComponentScan(basePackages = {"service"})
public class ApplicationConfig {
  .....
}

3.@Transcational 开启指定方法的事务

  @Transactional
  @Override
   public int addStudent(Student student) {
        return studentDao.addStudent(student);
   }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【案例实践】InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作中的应用

【查看原文】InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用 【专家】&#xff1a; 白老师&#xff08;研究员&#xff09;&#xff1a;长期从事生态系统结构-格局-过程-功能-服务的变化与响应关系等研究工作&#xff1b;重点围绕生…

使用 .NET MAUI 开发 ChatGPT 客户端

最近 chatgpt 很火&#xff0c;由于网页版本限制了 ip&#xff0c;还得必须开代理&#xff0c;用起来比较麻烦&#xff0c;所以我尝试用 maui 开发一个聊天小应用&#xff0c;结合 chatgpt 的开放 api 来实现&#xff08;很多客户端使用网页版本接口用 cookie 的方式&#xff0…

含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入)

所谓文无第一&#xff0c;武无第二&#xff0c;云原生人工智能技术目前呈现三足鼎立的态势&#xff0c;微软&#xff0c;谷歌以及亚马逊三大巨头各擅胜场&#xff0c;不分伯仲&#xff0c;但目前微软Azure平台不仅仅只是一个PaaS平台&#xff0c;相比AWS&#xff0c;以及GAE&am…

【云原生】k8s的pod基础

内容预知 1.pod的相关知识 1.1 pod的基础概念 1.2 k8s中pod的两种使用方式 1.3 pod 容器的常规使用流程 1.4 k8s中pod结构设计的巧妙用意 通常把Pod分为两类 2. 容器的分类 2.1 pause基础容器&#xff08;infrastructure container&#xff09; &#xff08;1&#xf…

安装ZIMG 图片服务器

简介&#xff1a;zimg是图像存储和处理服务器。您可以使用URL参数从zimg获取压缩和缩放的图像。 zimg的并发I / O&#xff0c;分布式存储和时间处理能力非常出色。 您不再需要在图像服务器中使用nginx。在基准测试中&#xff0c;zimg可以在高并发级别上处理每秒3000图像下载任务…

【性能篇】29 # 怎么给Canvas绘制加速?

说明 【跟月影学可视化】学习笔记。 方法一&#xff1a;优化 Canvas 指令 例子&#xff1a;实现一些位置随机的多边形&#xff0c;并且不断刷新这些图形的形状和位置 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

openGauss的WDR报告解读

文章目录1.执行以下SQL命令,查询已经生成的快照信息。2.生成WDR报告。3.手工创建快照信息4.WDR涉及的数据表5.WDR报告解读在Oralce数据库中&#xff0c;遇到性能问题&#xff0c;我们通常会查看有无对应时间段的快照&#xff0c;生成awr报告并进一步分析&#xff08;AWR是Autom…

海量数据小内存!只出现两次的数以及中位数怎么找

文章目录题目一题目二实际上类似的题目类似的解法在之前已经有介绍过海量数据小内存&#xff01;如何找到高频数 海量数据小内存&#xff01;从未出现过的数在哪里 题目一 如何在 40 亿个无符号整数中找到出现次数只有两次的那些数&#xff0c;在只提供 1 G 内存的条件下 解…

Map集合概述、API 遍历方式(键值对集合)

注意&#xff1a; Map集合和Collection集合是两个不同类型的集合 Map集合体系特点&#xff1a; 常用API&#xff1a; 根据键找出值&#xff1a; map.get(key); 取所有键的集合和取所有值得集合&#xff1a; 因为key是无序不重复无索引&#xff0c;所以放入set集合&#xff…

锂电池电压和电量的关系

锂电池电压和电量之间,有一定的对应关系,通过对开路电压的测量,可以大致得出电池的剩余电量。不过用电压测量电量的方式有一定的不稳定性,例如放电电流、环境温度、循环、放电平台、电极材料等,都会给最后结果的准确与否带来影响。 电压和电量的对应关系是: 100%----4.…

【算法】常用查找算法(顺序查找、二分查找、插值查找、斐波那契查找)

目录查找算法1.线性(顺序)查找(1)思路(2)代码实现(java)2.二分(折半)查找(1)思路(2)代码实现(java)3.插值查找(1)思路(2)代码实现(java)4.斐波那契(黄金分割法)查找(1)思路(2)代码实现(java)查找算法 1.线性(顺序)查找 (1)思路 判断序列中是否包含某个元素&#xff0c;找到提…

Vue3引入Lottie动画以及遇到的坑

之所以写这个问题是因为原本我认为非常小的一件事却困扰了我一整天&#xff0c;所以我打算写一个博客记录一番。 国外动画网址&#xff1a;Lottie 将来用到的lottie组件库网址&#xff1a; Vue3-lottie 我目前用的第二个&#xff1a; Vue3-lottiejs 1. 我在引入Lottie的时…

【Python机器学习】决策树与随机森林的讲解及决策树在决策决策问题中实战(图文解释 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~ 在生活中人们经常应用决策树的思想来做决定 分类的建模过程与上面做决定的过程相反&#xff0c;事先不知道人们的决策思路&#xff0c;需要通过人们已经做出的大量决定来“揣摩”出其决策思路&#xff0c;也就是通过大量数据来归纳道…

嵌入式分享合集124

一、19个常用的5V转3.3V技巧 01 使用LDO稳压器 标准三端线性稳压器的压差通常是 2.0-3.0V。要把 5V 可靠地转换为 3.3V&#xff0c;就不能使用它们。压差为几百个毫伏的低压降 &#xff08;Low Dropout&#xff0c; LDO&#xff09;稳压器&#xff0c;是此类应用的理想选择。图…

常见的CSS布局方法

常见的CSS布局方法 「1. 单栏布局」 常见的单列布局有两种: header,content 和 footer 等宽的单列布局header 与 footer 等宽,content 略窄的单列布局header,content 和 footer 等宽的单列布局 ​ 先通过对 header,content,footer 统一设置 width:1000px;或者 max-width:1…

DHCP报文

一. 介绍 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;统一使用两个IANA分配的端口&#xff1a;67&#xff08;服务器端&#xff09;&#xff0c;68&#xff…

Django学习Day5

由于前两天核酸阳的&#xff0c;一直发烧&#xff0c;故没有学习&#xff0c;csdn也没有进行更新。今天身体基本恢复&#xff0c;继续Django的学习旅程。也希望各位读者重视个人的身体健康&#xff0c;做好自己健康的第一负责人。 1.关于针对模型类的数据库修改方法补充 在mo…

二苯基环辛炔-氨基;DBCO-NH2科研实验用试剂DBCO-Amine;CAS:1255942-06-3

英文名称&#xff1a;DBCO-Amine DBCO-NH2 中文名称&#xff1a;二苯基环辛炔-氨基 CAS&#xff1a;1255942-06-3 分子式&#xff1a;C18H16N2 分子量&#xff1a;276.3 外观&#xff1a;固体粉末 溶剂&#xff1a;溶于 DMSO, DMF, DCM, THF, Chloroform 储存条件&…

什么是容器安全性,您如何提升自己的安全性?

容器无疑已成为部署应用程序的流行方式。这很棒&#xff0c;因为与部署到虚拟机相比&#xff0c;它们具有大量优势。其中一些优点包括便携、不可变和轻量级。您可以控制运行服务的容器内部的内容&#xff0c;这可以产生清晰、可审计的跟踪。 对于安全专业人员来说&#xff0c;…

模型复杂度与硬件性能的衡量

1. 模型复杂度的衡量 参数数量&#xff08;Params&#xff09;&#xff1a;指模型含有多少参数&#xff0c;直接决定模型的大小&#xff0c;也影响推断时对内存的占用量 单位通常为 M&#xff0c;通常参数用 float32 表示&#xff0c;所以模型大小是参数数量的 4 倍左右参数数…