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

Spring Boot自动装配代码详解

  1. 概述

    • Spring Boot自动装配是其核心特性之一,它能够根据项目中添加的依赖自动配置Spring应用程序。通过自动装配,开发人员可以减少大量的配置工作,快速搭建起一个可用的Spring应用。
  2. 关键组件和注解

    • @SpringBootApplication注解
      • 这是Spring Boot应用的主注解,它是一个组合注解,实际上包含了@Configuration@EnableAutoConfiguration@ComponentScan三个注解。
      • @Configuration:表明这个类是一个配置类,用于定义Spring的Bean。在配置类中,可以通过@Bean注解方法来创建和配置Bean实例。例如:
        @Configuration
        public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
        }
        
        • 这里定义了一个名为myService的Bean,类型是MyService,其实现是MyServiceImpl
      • @EnableAutoConfiguration:这是自动装配的关键注解。它会启用Spring Boot的自动配置机制,告诉Spring Boot去根据项目的依赖和配置自动配置应用。它通过@Import注解导入了AutoConfigurationImportSelector类来实现自动配置的功能。
      • @ComponentScan:用于扫描指定包及其子包下的组件(如@Component@Service@Repository@Controller等注解标记的类),将它们注册为Spring的Bean。默认情况下,它会扫描主应用类所在的包及其子包。例如,如果主应用类在com.example.myapp包下,那么@ComponentScan会扫描com.example.myapp及其所有子包下的组件。
    • AutoConfigurationImportSelector
      • 这个类是自动装配的核心实现类。它实现了ImportSelector接口,该接口的selectImports方法用于返回要导入的配置类的全限定名数组。
      • AutoConfigurationImportSelector中,selectImports方法会从META - INF/spring.factories文件中读取自动配置类的列表。它通过SpringFactoriesLoader.loadFactoryNames方法来加载这些配置类,例如:
        public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
        
      • 这里的getAutoConfigurationEntry方法会获取需要自动导入的配置类,这些配置类是根据项目中的依赖和条件来确定的。
  3. META - INF/spring.factories文件机制

    • 这是自动装配的重要配置文件。在Spring Boot的各个依赖中,都可以包含META - INF/spring.factories文件。
    • 这个文件的格式是key = value的形式,其中一个关键的配置项是org.springframework.boot.autoconfigure.EnableAutoConfiguration。它的值是一个自动配置类的列表,例如:
      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\// 其他自动配置类
      
    • 当Spring Boot启动时,AutoConfigurationImportSelector会读取这些文件,找到所有的自动配置类。然后,根据条件注解(如@ConditionalOnClass@ConditionalOnMissingBean等)来判断这些自动配置类是否应该被应用。
    • 条件注解示例
      • @ConditionalOnClass:这个注解用于判断某个类是否在类路径上。例如,DataSourceAutoConfiguration中有如下注解:
        @Configuration
        @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
        public class DataSourceAutoConfiguration {// 配置内容
        }
        
        • 这表示只有当DataSource类和EmbeddedDatabaseType类都在类路径上时,DataSourceAutoConfiguration这个自动配置类才会被应用。这样可以确保只有在项目中添加了相关的数据源依赖时,才会进行数据源的自动配置。
      • @ConditionalOnMissingBean:用于判断某个类型的Bean是否不存在。例如,在某个自动配置类中定义一个方法来配置一个Bean:
        @Bean
        @ConditionalOnMissingBean
        public MyBean myBean() {return new MyBeanImpl();
        }
        
        • 这表示只有当容器中不存在MyBean类型的Bean时,才会创建并添加MyBeanImpl这个Bean到容器中。
  4. 自动配置的过程

    • Spring Boot应用启动时,首先会加载主应用类,由于@SpringBootApplication注解的存在,@Configuration注解使得这个类被视为一个配置类,@ComponentScan开始扫描组件。
    • 同时,@EnableAutoConfiguration触发自动装配过程。AutoConfigurationImportSelector从各个依赖的META - INF/spring.factories文件中获取自动配置类列表。
    • 然后,对于每个自动配置类,根据条件注解来检查是否满足应用条件。如果满足条件,就会将这个自动配置类加载到Spring容器中,自动配置类中的@Bean方法会被调用,创建和配置相应的Bean,从而完成自动装配的过程。

具体源码讲解

  1. @SpringBootApplication注解源码分析

    • 首先查看@SpringBootApplication注解的定义:
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoExcludeFilter.class)
    })
    public class SpringBootApplication {
    }
    
    • 可以看到它是一个组合注解,包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
    • @SpringBootConfiguration:它实际上就是@Configuration注解,用于标识这个类是一个配置类。
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    public class SpringBootConfiguration {
    }
    
    • @EnableAutoConfiguration:这是自动装配的关键。它的源码如下:
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public class EnableAutoConfiguration {
    }
    
    • 其中@Import(AutoConfigurationImportSelector.class)是核心部分。这个AutoConfigurationImportSelector类用于加载自动配置类。
    • @ComponentScan:用于扫描组件,它有一些默认的扫描规则和可以自定义的过滤规则,如上述代码中的excludeFilters,用于排除某些类型的组件扫描。
  2. AutoConfigurationImportSelector源码分析

    • AutoConfigurationImportSelector实现了ImportSelector接口,其中关键的方法是selectImports
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
    
    • 这个方法首先检查自动配置是否启用。然后通过AutoConfigurationMetadataLoader.loadMetadata加载自动配置元数据,再通过getAutoConfigurationEntry获取自动配置项。
    • 深入getAutoConfigurationEntry方法:
    protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);configurations = removeDuplicates(configurations);Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = filter(configurations, autoConfigurationMetadata);fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);
    }
    
    • 在这里,getCandidateConfigurations方法用于获取候选的自动配置类列表,它会从META - INF/spring.factories文件中读取相关配置:
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations, "No auto - configuration classes found in META - INF/spring.factories. If you " +"are using a custom packaging, make sure that file is correct.");return configurations;
    }
    
    • SpringFactoriesLoader.loadFactoryNames方法会读取META - INF/spring.factories文件,查找org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置类列表。
  3. META - INF/spring.factories文件读取源码分析

    • SpringFactoriesLoader类用于读取spring.factories文件,关键方法是loadFactoryNames
    public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {String factoryTypeName = factoryType.getName();return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
    }
    
    • 它调用了loadSpringFactories方法:
    private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = cache.get(classLoader);if (result!= null) {return result;}try {Enumeration<URL> urls = (classLoader!= null?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));result = new LinkedMultiValueMap<>();while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<Object, Object> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {result.add(factoryTypeName, factoryImplementationName.trim());}}}cache.put(classLoader, result);return result;} catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}
    }
    
    • 这个方法首先检查缓存中是否已经有读取的结果。如果没有,就通过ClassLoader获取META - INF/spring.factories文件的URL,然后将其内容读取到Properties对象中。最后,将文件中的配置解析出来,以key - value的形式存储在MultiValueMap中,其中key是配置项的类型(如org.springframework.boot.autoconfigure.EnableAutoConfiguration),value是对应的配置类列表。
  4. 条件注解的源码体现(以@ConditionalOnClass为例)

    • @ConditionalOnClass注解用于判断某个类是否在类路径上。它的实现基于Condition接口。
    • 当Spring容器在处理自动配置类时,会检查条件注解。@ConditionalOnClass对应的Condition实现类是OnClassCondition。在自动配置类加载过程中,会调用OnClassConditionmatches方法来判断条件是否满足:
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 省略部分代码List<String> onClasses = getCandidates(metadata, ConditionalOnClass.class);if (onClasses!= null) {List<String> missing = filter(onClasses, ClassNameFilter.MISSING, context);if (!missing.isEmpty()) {return false;}}List<String> onMissingClasses = getCandidates(metadata, ConditionalOnMissingClass.class);if (onMissingClasses!= null) {List<String> present = filter(onMissingClasses, ClassNameFilter.PRESENT, context);if (!present.isEmpty()) {return false;}}return true;
    }
    
    • 这个方法会获取@ConditionalOnClass注解中指定的类列表,然后检查这些类是否在类路径上。如果有任何一个指定的类不存在,就返回false,表示条件不满足,自动配置类不会被加载。通过这样的机制,Spring Boot可以根据类的存在与否来决定自动配置类的加载与否,实现智能的自动装配。

相关文章:

Spring Boot自动装配代码详解

概述 Spring Boot自动装配是其核心特性之一&#xff0c;它能够根据项目中添加的依赖自动配置Spring应用程序。通过自动装配&#xff0c;开发人员可以减少大量的配置工作&#xff0c;快速搭建起一个可用的Spring应用。 关键组件和注解 SpringBootApplication注解 这是Spring Bo…...

H7-TOOL固件2.27发布,新增加40多款芯片脱机烧录,含多款车轨芯片,发布LUA API手册,CAN助手增加负载率,错误状态信息检测

H7-TOOL详细介绍&#xff08;含操作手册&#xff09;&#xff1a;H7-TOOL开发工具&#xff0c;1拖4/16脱机烧录&#xff0c;高速DAPLINK&#xff0c;RTOS Trace&#xff0c;CAN/串口助手, 示波器, RTT等&#xff0c;支持WiFi&#xff0c;以太网&#xff0c;高速USB和手持 - H7-…...

Socket套接字

Socket工作原理。服务器端通过bind绑定socket&#xff0c;一直监听端口。 当客户端通过conncet方法连接指定计算机的端口&#xff0c;并使用send(&#xff09;向socket中写入信息。 生成套接字&#xff0c;主要有3个参数&#xff1a;通信的目的IP地址、使用的传输层协议(TCP或…...

《学校一卡通管理系统》数据库MySQL的设计与实现

引言:学校一卡通管理系统旨在为学校提供一个高效的数字化管理平台,集中管理学生和教职工的账户、充值、消费、查询等日常事务。通过该系统,学生可以便捷地进行充值、消费及查看余额,管理员则可以高效地管理用户账户、充值记录、消费记录等数据。系统采用MySQL数据库,通过视…...

windows C#-接口中的索引器

可以在接口上声明索引器。 接口索引器的访问器与类索引器的访问器有所不同&#xff0c;差异如下&#xff1a; 接口访问器不使用修饰符。接口访问器通常没有正文。 访问器的用途是指示索引器为读写、只读还是只写。 可以为接口中定义的索引器提供实现&#xff0c;但这种情况非…...

element-plus大版本一样,但是小版本不一样导致页面出bug

npm 的版本 node的版本 npm的源这些都一样&#xff0c;但是效果不一样 发现是element的包版本不一样导致的 2.9.1与2.8.1的源是不一样的&#xff0c;导致页面出bug;...

三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇

一、引言 1.1 研究背景与意义 随着医疗卫生体制改革的不断深化以及信息技术的飞速发展,三甲医院评审作为衡量医院综合实力与服务水平的重要标准,对数据集成与共享提出了更为严苛的要求。在传统医疗模式下,医院内部各业务系统往往各自为政,形成诸多“信息孤岛”,使得数据…...

关于数组的一些应用--------数组作函数的返回值(斐波那契数列数列的实现)

数组在作为函数的返回值&#xff0c;一个很经典的例子就是获取斐波那契数列的前N项 代码思路&#xff1a; 设计思路 输入&#xff1a; 输入一个整数 n&#xff0c;表示要生成斐波那契数列的长度。 输出&#xff1a; 输出一个长度为 n 的整数数组&#xff0c;其中每个元素为斐…...

PWN的知识之栈溢出

栈溢出 什么是栈溢出&#xff1f; 栈溢出&#xff08;Stack Overflow&#xff09;是指在程序运行过程中&#xff0c;向栈中存放的数据量超过了栈的最大容量&#xff0c;从而导致程序出现异常行为的情况。可以比作一个箱子原本只能容纳一定数量的物品&#xff0c;如果强行往里…...

智能客户服务:科技如何重塑客户服务体验

在数字化时代&#xff0c;客户对于服务的需求和期望在不断演变。传统的客户服务模式已经难以满足现代消费者对于即时性、个性化和高效性的追求。随着人工智能、大数据、云计算等先进技术的蓬勃发展&#xff0c;智能客户服务应运而生&#xff0c;不仅重塑了客户服务的体验&#…...

HarmonyOS鸿蒙开发 应用开发常见问题总结(持续更新...)

HarmonyOS鸿蒙开发 应用开发常见问题总结(持续更新…) 在学习鸿蒙开发过程中&#xff0c;也是遇到了不少问题&#xff0c;在代码编写过程中&#xff0c;遇到了一些问题&#xff0c;由于是学习阶段&#xff0c;需要时刻记录一下。 If a component attribute supports local in…...

数据结构-单链表(C语言版)

创建一个链表&#xff0c;实现&#xff1a;1.以头结点开始插入数据&#xff08;头插法&#xff09;2.以尾节点开始插入数据&#xff08;尾插法&#xff09;3.输出链表所存入数据 4.指定位置插入数据 5.指定位置删除数据 #include<stdio.h> #include<stdlib.h> type…...

View Shadcn UI 正式版本 v2024.5.4 发布

亲爱的开发者社区&#xff1a; 我们很高兴地宣布 View Shadcn UI 的正式版本 v2024.5.4 已于 2024 年 12 月 30 日正式发布&#xff01;View Shadcn UI 是一个基于 Tailwind CSS 构建的 Vue3 组件库&#xff0c;旨在为 Vue3 开发者提供优雅、可定制且易用的 UI 组件。 &#…...

RocketMQ使用场景问题

1.消息丢失 有这么一个场景&#xff0c;就是订单支付完成之后&#xff0c;订单系统会进行发送消息给RocketMQ集群&#xff0c;下游会有积分系统进行监听这个消息&#xff0c;进行消费然后给用户发放积分。在下面的这个场景中&#xff0c;通过查询日志发现了订单系统发送订单支付…...

医院机房运维:所有IT资源运行状态同一平台实时呈现

在当今数字化医疗高速发展的时代&#xff0c;医院的信息化系统已然成为保障医疗服务顺畅开展、守护患者生命健康的关键基础设施。以郑州人民医院为例&#xff0c;随着医疗业务不断拓展&#xff0c;其背后支撑的机房运维面临着诸多棘手难题。 传统的分散式人工维护模式&#xff…...

windows远程桌面无法连接,报错:“由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系”

windows远程桌面无法连接&#xff0c;报错&#xff1a;“由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程会话被中断。请跟服务器管理员联系” 问题描述&#xff1a;解决方法&#xff1a;无法删除条目解决如下&#xff1a;正常激活详见&#xff1a;[RDS远程服务激活…...

Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)

概念 事务定义 事务&#xff0c;就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行&#xff0c;我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行&#xff0c;我们称该事务被提交。…...

[gcc]代码演示-O使用场景

使用场景&#xff1a; 开发阶段&#xff1a; 在开发阶段&#xff0c;通常使用 -O0&#xff08;无优化&#xff09;以获得最快的编译速度和最完整的调试信息。这有助于快速迭代和调试。对于性能测试&#xff0c;可以使用 -O1 或 -O2 以获得一些基本的优化&#xff0c;同时保持较…...

conan从sourceforge.net下载软件失败

从sourceforge.net下载软件&#xff0c;经常会没有开始下载就返回了。 原因是&#xff1a; 自动选择的镜像站不能打开。 在浏览器中&#xff0c;我们可以手动选择站点尝试&#xff0c;但是conan就不行了。 手动选择一个站点&#xff0c;能够有文件保存窗口弹出&#xff0c;之后…...

电脑msvcp140.dll是什么文件?怎么修复电脑msvcp140.dll缺失的问题?

电脑msvcp140.dll文件详解及缺失问题修复指南 在探索电脑的奥秘时&#xff0c;我们时常会遇到各种文件、错误代码和系统问题。今天&#xff0c;我将为大家深入解析一个常见的系统文件——msvcp140.dll&#xff0c;以及当这个文件缺失时应该如何进行修复。作为一名在软件开发领…...

基于STM32的热带鱼缸控制系统的设计

文章目录 一、热带鱼缸控制系统1.题目要求2.思路3.电路仿真3.1 未仿真3.2 开始仿真&#xff0c;显示屏显示水温、浑浊度、光照强度等值3.3 当水温低于阈值&#xff0c;开启加热并声光报警3.4 当浑浊度高于阈值&#xff0c;开启自动换水并声光报警3.5 当光照低于阈值&#xff0c…...

unity学习7:unity的3D项目的基本操作: 坐标系

目录 学习参考 1 unity的坐标系 1.1 左手坐标系 1.2 左手坐标系和右手坐标系的区别 1.3 坐标系的原点(0,0,0) 2 坐标系下的具体xyz坐标 2.1 position这里的具体xyz坐标值 2.2 父坐标 2.3 世界坐标和相对坐标 2.3.1 世界坐标 2.3.2 相对坐标 2.4 父物体&#xff0c;…...

认识一下,轻量消息推送 Server-Sent Events

什么是 SSE(Server-Sent Events) Server-Sent Events(简称 SSE)是一种在浏览器中实现单向实时通信的技术。它允许服务器通过 HTTP 持久连接向客户端发送实时更新的数据流。这种通信模式非常适用于需要频繁向客户端推送数据的场景,例如股票行情更新、实时聊天通知、社交媒…...

Python爬虫入门指南:从零开始抓取数据

Python爬虫入门指南&#xff1a;从零开始抓取数据 引言 在大数据时代&#xff0c;数据是新的石油。而爬虫作为获取数据的重要手段&#xff0c;受到了越来越多的关注。Python作为一门强大的编程语言&#xff0c;其简洁易用的特性使得它成为爬虫开发的首选语言。本篇文章将带你…...

c++ vector 使用find查找指定元素方法

在 C 中&#xff0c;std::vector 是一个动态数组&#xff0c;用于存储同类型元素的序列。如果你想在 std::vector 中查找指定元素&#xff0c;可以使用 std::find 算法。std::find 是定义在 <algorithm> 头文件中的标准库函数。 以下是一个示例代码&#xff0c;展示了如…...

计算机组成原理——控制单元设计

组合逻辑设计...

特征点检测与匹配——MATLAB R2022b

特征点检测与匹配在计算机视觉中的作用至关重要,它为图像处理、物体识别、增强现实等领域提供了坚实的基础。 目录 Harris角点检测 SIFT(尺度不变特征变换) SURF(加速稳健特征) ORB(Oriented FAST and Rotated BRIEF) 总结 特征点检测与匹配是计算机视觉中的一项基…...

在 IntelliJ IDEA 中开发 GPT 自动补全插件

背景与目标 随着 AI 的发展&#xff0c;GitHub Copilot 等智能代码补全工具在开发者中获得了广泛的应用&#xff0c;极大地提高了编程效率。本篇文章将教你如何开发一个 IntelliJ IDEA 插件&#xff0c;使用 OpenAI 的 GPT API 来实现类似 Copilot 的代码自动补全功能。通过这…...

主键有多种设计

1. 自增ID id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID 优点&#xff1a; 简单直观自动生成递增有序&#xff0c;对索引友好 缺点&#xff1a; 可能暴露业务信息分布式系统下需要特殊处理合并数据时可能冲突 2. UUID/GUID id char(36) NOT NULL COMMENT 主键ID …...

SCT12A0,一款2.7V-14V Vin、30W全集成同步升压转换器

SCT12A0是一款高效率&#xff0c;全集成 13mΩ 高侧MOSFET和11mΩ低侧MOSFET的同步升压转换器&#xff0c;支持 2.7V 至 14V 输入电压范围&#xff0c;最高可达12A 开关电流。开关电流限可以通过外部电阻进行调节。 SCT12A0采用自适应恒定关断时间峰值电流控制以提供快速瞬态。…...

Python 数据结构揭秘:栈与队列

栈&#xff08;Stack&#xff09; 定义 栈是一种后进先出&#xff08;Last In First Out, LIFO&#xff09;的数据结构。它类似于一个容器&#xff0c;只能在一端进行插入和删除操作。栈有两个主要的操作&#xff1a;push&#xff08;入栈&#xff09;和 pop&#xff08;出栈…...

3、蓝牙打印机按键 - GPIO输入控制

1、硬件 1.1、看原理图 初始高电平&#xff0c;按键按下导通处于低电平状态。 PB8号引脚。 1.2、看手册 a、看系统架构 GPIOB号端口有APB2总线控制 b、RCC使能 RCC->APB2ENR的第3位控制GPIOB使能。 c、GPIOB寄存器配置 浮空输入模式下&#xff0c;I/O的电平状态是不确定…...

LeetCode--复原IP地址(面试手撕算法高频题)

题目描述:有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.…...

050_小驰私房菜_MTK Camera debug, data rate 、mipi_pixel_rate 确认

mipi_pixel_rate = data rate * 4 / 10 (4 是表示4lane,10表示raw数据是10bit) mipi_pixel_rate 信息,我们可以通过 sentest命令打印看到: 下面的信息我们可以看到,mipi_pixel_rate = 501.357739Mpps,mipi rate = 10000000,是对应的我们驱动文件里面配置写的mipi_pixel_r…...

TCP粘/拆包----自定义消息协议

今天是2024年12月31日&#xff0c;今年的最后一天&#xff0c;希望所有的努力在新的一年会有回报。❀ 无路可退&#xff0c;放弃很难&#xff0c;坚持很酷 TCP传输 是一种面向二进制的&#xff0c;流的传输。在传输过程中最大的问题是消息之间的边界不明确。而在服务端主要的…...

conda指定路径安装虚拟python环境

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法

板卡选择困难症了&#xff1f;如果你也想玩FPGA、STM32、ESP32、RP2040相关的板卡&#xff0c;不如看看以下几款板卡&#xff0c;如果正巧碰上能实现你想要做的项目呢~ 01 小脚丫FPGA STEP BaseBoard V4.0套件 STEP BaseBoard V4.0是第4代小脚丫FPGA扩展底板&#xff08;点击了…...

Flume拦截器的实现

Flume conf文件编写 vim file_to_kafka.conf#定义组件 a1.sources r1 a1.channels c1#配置source a1.sources.r1.type TAILDIR a1.sources.r1.filegroups f1 a1.sources.r1.filegroups.f1 /Users/zhangjin/model/project/realtime-flink/applog/log/app.* # 设置断点续传…...

【数据仓库】hadoop web UI 增加账号密码认证

​ 升级了hadoop版本到3.3.6,未配置任何鉴权,默认端口9870 8088开放到了公网,结果没几天就被挖矿攻击了。通过开放的端口提交了很多非法任务到yarn上,并成功在服务器执行了恶意脚本。这次是真实真切的感受了,网络环境的险恶,以前仅仅是别人的案例来提高自己的安全意识,这…...

《特征工程:自动化浪潮下的坚守与变革》

在机器学习的广阔天地中&#xff0c;特征工程一直占据着举足轻重的地位。它宛如一位幕后的工匠&#xff0c;精心雕琢着原始数据&#xff0c;将其转化为能够被机器学习模型高效利用的特征&#xff0c;从而推动模型性能迈向新的高度。然而&#xff0c;随着技术的飞速发展&#xf…...

【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践

一、前言 随着企业业务的快速发展和数据量的不断增长&#xff0c;高性能、高可用的数据库解决方案成为了关键需求。OceanBase作为一款分布式关系型数据库&#xff0c;以其高扩展性、高可用性和高性能的特点&#xff0c;逐渐受到企业的广泛关注。然而&#xff0c;在复杂的分布式…...

新能源电动汽车动力电池技术

新能源电动汽车动力电池技术是新能源汽车发展的核心之一&#xff0c;以下是动力电池技术的一些关键方面&#xff1a; 技术进展 能量密度提升&#xff1a;近年来&#xff0c;动力电池的能量密度有了显著提升&#xff0c;从2010年的100Wh/kg提高到2024年的300Wh/kg。能量密度的…...

小程序组件 —— 30 组件 - 背景图片的使用

在编写小程序的样式文件时&#xff0c;可以使用 background-image 属性来设置元素的背景图像&#xff1b;但是这个属性在微信小程序中使用时存在坑&#xff1b; 注意事项&#xff1a;微信小程序中的 background-iamge 不支持本地路径&#xff01;需要使用网络图片&#xff0c;…...

量子力学复习

黑体辐射 热辐射 绝对黑体&#xff1a; &#xff08;辐射能力很强&#xff0c;完全的吸收体&#xff0c;理想的发射体&#xff09; 辐射实验规律&#xff1a; 温度越高&#xff0c;能量越大&#xff0c;亮度越亮 温度越高&#xff0c;波长越短 光电效应 实验装置&#xf…...

n8n - AI自动化工作流

文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台&#xff0c;它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证&#xff0c;n8n可让您构建强大的自动化…...

1.1.7 master公式的使用

code 递归例子 – 返回最大数据 # 递归行为&#xff0c; 返回[L, R]的最大值 # 递归&#xff1a;base case&#xff1b; 遍历&#xff1b;返回值 from test1 import *def getMax(arr):return process(arr, 0, len(arr)-1)def process(arr, L, R):if (L R):return arr[L] #…...

Windows系统安装Docker Desktop

文章目录 注意事项安装步骤官网下载软件安装到其它盘符操作(如果就想安装到C盘可以跳过这个步骤, 直接执行文件)等待出现软件安装界面Windows系统的配置软件的一些必要设置(以下设置需要点击apply才能生效&#xff0c;如果点不了&#xff0c;那就是安装后&#xff0c;出现了错误…...

快速上手LangChain(四)LangChain Hub和LangSmith

文章目录 快速上手LangChain&#xff08;四&#xff09;LangChain Hub和LangSmith什么是LangChain HubLangChain Hub功能 LangSmith使用 快速上手LangChain&#xff08;四&#xff09;LangChain Hub和LangSmith 什么是LangChain Hub LangChain Hub官网地址&#xff1a;https:…...

jquery实现的网页版扫雷小游戏源码

源码介绍 这是一款基于jQuery实现的经典扫雷小游戏源码&#xff0c;玩家根据游戏规则进行游戏&#xff0c;末尾再在确定的地雷位置单击右键安插上小红旗即可赢得游戏&#xff01;是一款非常经典的jQuery游戏代码。本源码改进了获胜之后的读数暂停功能。 效果预览 源码下载 j…...

C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡

雷赛控制技术 DMC系列运动控制卡是一款新型的 PCI/PCIe 总线运动控制卡。可以控制多个步进电机或数字式伺服电机&#xff1b;适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO 控制、位置比较、位置锁存等功能的应用。 DMC3000 系列卡的运动控制函数库功…...