SpringBoot组件扫描过滤器:精准控制Bean注册的5种策略
1. 项目概述为什么我们需要自定义组件扫描过滤器在SpringBoot项目中ComponentScan注解是我们再熟悉不过的老朋友了。它负责在启动时扫描指定包路径下的类将那些标注了Component、Service、Repository、Controller等注解的Bean定义加载到Spring的IoC容器中。这听起来很自动化对吧但实际开发中这种“全自动”有时会带来意想不到的麻烦。想象一下这个场景你的项目引入了一个第三方库这个库内部也使用了Spring并且定义了一些Bean。你的主应用扫描包路径时一不小心把第三方库的包也扫进来了。结果就是两个同名的Bean在容器里打架或者第三方库的Bean配置干扰了你自己的业务逻辑导致应用启动失败或者行为异常。又或者在微服务架构下你有一个公共的common模块里面定义了一些工具类和基础配置但其中某些配置类你只希望在特定的服务子模块中生效而不是在所有引用了common模块的服务中都自动注册。这时候你就需要一把“手术刀”而不是一把“大锤”。ComponentScan注解的excludeFilters属性就是这把精准的手术刀。它允许你定义一组过滤器Filter在组件扫描的过程中将那些符合特定条件的类排除在外不让它们被注册为Spring Bean。这个功能看似简单但却是解决依赖冲突、实现模块化配置、进行条件化装配的利器。很多面试官喜欢问SpringBoot的自动装配原理而ComponentScan及其过滤器机制正是理解自动装配“选择性”的关键一环。理解了它你就能更从容地应对复杂的项目依赖和定制化的Bean加载需求。2. ComponentScan excludeFilters 核心机制深度解析要玩转excludeFilters我们必须先深入理解它的工作机制。这不仅仅是加个注解那么简单而是涉及到Spring框架底层类扫描和Bean定义注册的核心流程。2.1 过滤器Filter的工作原理与生命周期ComponentScan注解中的includeFilters和excludeFilters属性接收的是一个ComponentScan.Filter数组。每个Filter注解主要包含两个关键属性type和classes或pattern。当SpringBoot应用启动执行到ComponentScan步骤时ClassPathBeanDefinitionScanner这个扫描器会开始工作。它的工作流程可以简化为确定扫描路径根据ComponentScan的basePackages或basePackageClasses属性确定要扫描的物理目录。资源查找在指定路径下查找所有.class文件。元数据读取使用ASM或反射等机制读取类的元数据注解、父类、接口等但并不加载类到JVM。过滤器裁决对每一个候选的类依次通过配置的过滤器进行判断。这个判断发生在Bean定义BeanDefinition被创建和注册之前是一个非常早期的阶段。注册Bean定义只有通过了所有过滤器裁决的类才会被解析成一个BeanDefinition并注册到BeanDefinitionRegistry中后续才会被实例化成Bean。excludeFilters的裁决优先级通常很高。如果一个类匹配了任何一个excludeFilters规则它就会被立即排除后续的includeFilters也不会再对它生效。这种设计保证了排除逻辑的绝对性。2.2 FilterType 枚举五种武器库FilterType枚举定义了过滤器的匹配类型这是excludeFilters的灵魂所在。它提供了五种不同的匹配策略让你可以从不同维度精准定位需要排除的类。FilterType 类型含义与用途适用场景ANNOTATION根据注解匹配。这是最常用的一种。排除所有标注了特定注解的类。例如排除所有Configuration类或者排除所有使用了过时注解的类。ASSIGNABLE_TYPE根据类型匹配。可以指定一个具体的类。排除某个特定的类或者排除某个基类/接口的所有子类。功能强大且精确。ASPECTJ使用AspectJ类型表达式匹配。进行复杂的包名、类名模式匹配。比如排除com.example.service.impl包下所有类但保留com.example.service包。REGEX使用正则表达式匹配类名。当类名有规律时可以用正则进行批量排除。例如排除所有以Test结尾的类。CUSTOM自定义匹配逻辑。这是最灵活的方式。当以上四种标准方式都无法满足你的复杂过滤逻辑时就需要实现TypeFilter接口来自定义。选择哪种FilterType追求简单直接用ANNOTATION或ASSIGNABLE_TYPE。需要模式匹配用ASPECTJ或REGEX。逻辑极其复杂用CUSTOM。注意ASPECTJ表达式功能虽然强大但书写相对复杂且如果项目中没有引入AspectJ依赖可能需要额外处理。在大部分排除特定包或类的场景下ASSIGNABLE_TYPE和ANNOTATION已经足够。3. 五种FilterType实战详解与避坑指南理论讲完了我们直接上代码看看这五种过滤器具体怎么用以及在实际操作中会遇到哪些坑。3.1 ANNOTATION基于注解的精准排除这是最直观的过滤方式。假设我们项目里引入了一个库它用Deprecated注解标记了一些老的配置类我们不想让这些类生效。SpringBootApplication ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.ANNOTATION, classes Deprecated.class) }) public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }这段配置的意思是在扫描过程中排除所有直接标注了Deprecated注解的类。但这里有个重要的坑它只对类级别直接标注的Deprecated生效。如果Deprecated注解是用在方法或字段上或者这个类是通过其他注解如自定义的LegacyComponent间接表示已废弃ANNOTATION过滤器是扫不到的。因为它只进行直接的注解元数据匹配。实操心得ANNOTATION过滤器非常“老实”它只看类上有没有贴这个标签。对于间接的、逻辑上的“废弃”它无能为力。在这种情况下你可能需要结合ASSIGNABLE_TYPE来排除具体的类或者用CUSTOM过滤器实现更复杂的逻辑。3.2 ASSIGNABLE_TYPE基于类型继承关系的排除这个类型非常强大它基于Java的类继承体系。你可以指定一个基类或接口那么它的所有子类、实现类都会被排除。场景一排除某个具体的工具类我们有一个ThirdPartyUtil类来自第三方jar包它会自动注册一个Bean但我们想用自己的实现。ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.ASSIGNABLE_TYPE, classes ThirdPartyUtil.class) })这样ThirdPartyUtil这个类本身就会被排除。场景二排除某个接口的所有实现更常见的是我们想排除某个策略接口的所有默认实现。例如项目有一个CacheProvider接口第三方库提供了RedisCacheProvider和LocalCacheProvider两个默认实现但我们想全部排除使用自己的CustomCacheProvider。ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.ASSIGNABLE_TYPE, classes CacheProvider.class) })注意这样配置会把CacheProvider接口本身以及所有实现了CacheProvider的类都排除掉。如果你的CustomCacheProvider也实现了这个接口并且和这些排除配置在同一个扫描路径下那么它同样会被排除这是一个极易踩坑的地方。避坑指南使用ASSIGNABLE_TYPE排除基类/接口时一定要确保你希望保留的类不在同一个扫描包下或者通过更精细的包路径扫描basePackages来隔离。更好的做法是将需要排除的第三方类放在独立的包中然后使用ASPECTJ表达式只排除那个特定的第三方包。3.3 ASPECTJ强大的模式匹配排除当你需要排除一整个包或者符合某种命名模式的所有类时ASPECTJ表达式就派上用场了。Spring支持标准的AspectJ类型匹配表达式。示例排除com.thirdparty.lib包下的所有类ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.ASPECTJ, pattern com.thirdparty.lib..*) })这里的..*表示com.thirdparty.lib包及其所有子包下的任何类。示例排除impl子包下所有类但保留接口包ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.ASPECTJ, pattern com.example.service.impl..*) })常见问题ASPECTJ表达式写错了怎么办表达式语法错误通常不会导致应用启动失败但会导致过滤不生效。排查时一个有效的方法是开启Spring的调试日志logging.level.org.springframework.contextDEBUG在日志中搜索“Candidate component”来查看哪些类被扫描器认为是候选组件从而判断你的过滤器是否起了作用。3.4 REGEX正则表达式匹配类名如果你要排除的类在命名上有明显的规律比如所有以Legacy开头或者以Test结尾的类使用正则表达式会更方便。示例排除所有类名以Legacy开头的类ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.REGEX, pattern .*Legacy.*) })这个正则会匹配任何类名中包含Legacy的类。.*代表任意字符出现任意次。性能提示正则表达式匹配是在类路径扫描时对每个候选类的全限定名进行的。如果项目非常大类非常多复杂的正则表达式可能会对启动速度有轻微影响。在性能敏感的场景下ASSIGNABLE_TYPE通常是效率更高的选择因为它是基于类加载器已加载的类信息进行判断。3.5 CUSTOM终极自定义过滤器当前面四种标准方式都无法满足你的变态需求时CUSTOM类型就是你的王牌。你需要自己实现org.springframework.core.type.filter.TypeFilter接口。场景我们想排除所有类名包含“Mock”且同时实现了ApplicationListener接口的类。这种组合条件标准过滤器做不到。第一步实现自定义TypeFilterpublic class CustomExcludeFilter implements TypeFilter { Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { // 1. 获取类元数据 ClassMetadata classMetadata metadataReader.getClassMetadata(); String className classMetadata.getClassName(); // 2. 判断类名是否包含Mock boolean nameContainsMock className.contains(Mock); // 3. 判断是否实现了ApplicationListener接口 // 注意这里获取的是当前类直接声明的接口如果需要包括父类实现的接口逻辑更复杂 String[] interfaceNames classMetadata.getInterfaceNames(); boolean implementsAppListener Arrays.stream(interfaceNames) .anyMatch(name - name.equals(org.springframework.context.ApplicationListener)); // 4. 自定义逻辑当两个条件都满足时返回true表示匹配应被排除 return nameContainsMock implementsAppListener; } }第二步在ComponentScan中使用自定义过滤器ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.CUSTOM, classes CustomExcludeFilter.class) })深度解析TypeFilter.match方法MetadataReader提供了访问类元数据的入口无需加载类。ClassMetadata可以获取类名、父类名、接口名、是否是抽象类等信息。AnnotationMetadata可以获取类上的所有注解信息。MetadataReaderFactory可以用于创建其他类的MetadataReader用于递归检查。高级技巧你可以在CustomExcludeFilter中注入Environment对象通过实现EnvironmentAware接口从而实现基于配置文件的动态过滤。比如在application-test.properties中设置一个属性让过滤器在测试环境排除某些组件。警告自定义过滤器的match方法会在扫描过程中被频繁调用务必保证其逻辑高效避免复杂的IO操作或远程调用否则会严重拖慢应用启动速度。4. 复杂场景下的组合拳与配置优先级单一过滤器往往解决不了复杂问题。在实际项目中我们经常需要组合使用多个过滤器并且要清楚它们与SpringBoot其他配置的优先级关系。4.1 多过滤器组合配置excludeFilters属性本身就是一个数组你可以同时配置多个Filter。SpringBootApplication ComponentScan(excludeFilters { // 排除第三方库的配置类 ComponentScan.Filter(type FilterType.ASSIGNABLE_TYPE, classes ThirdPartyConfig.class), // 排除所有测试相关的组件按注解 ComponentScan.Filter(type FilterType.ANNOTATION, classes MockitoAnnotations.class), // 排除legacy包下所有内容按包名 ComponentScan.Filter(type FilterType.ASPECTJ, pattern com.company.legacy..*), // 使用自定义过滤器进行复杂排除 ComponentScan.Filter(type FilterType.CUSTOM, classes DynamicExcludeFilter.class) }) public class Application { // ... }多个过滤器之间是“或”的关系。一个类只要匹配任意一个excludeFilter就会被排除。4.2 与SpringBootApplication注解的继承关系SpringBootApplication是一个复合注解它本身已经包含了ComponentScan。如果你在启动类上同时使用SpringBootApplication和ComponentScan那么ComponentScan的配置会覆盖SpringBootApplication中默认的扫描行为。更常见的做法是将需要特殊扫描配置的ComponentScan放在一个独立的Configuration配置类上然后在启动类上通过Import导入或者确保这个配置类本身在启动类的扫描路径之内。这样可以保持启动类的简洁并且让扫描配置更加模块化。Configuration ComponentScan(basePackages com.example.business, excludeFilters Filter(type FilterType.ANNOTATION, classes Repository.class)) public class BusinessModuleConfig { // 业务模块配置排除所有Repository } SpringBootApplication Import(BusinessModuleConfig.class) // 导入特定配置 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }4.3 自动装配类中的 excludeFilters这是SpringBoot自动装配的精髓之一。很多官方提供的EnableXXX或自动配置类XXXAutoConfiguration内部都使用了ComponentScan或SpringBootApplication的exclude属性注意SpringBootApplication有exclude和excludeName属性用于排除自动配置类其原理与excludeFilters类似但作用对象不同。例如你想禁用SpringBoot自带的DataSourceAutoConfiguration可以在启动类上这样写SpringBootApplication(exclude {DataSourceAutoConfiguration.class}) public class Application { // ... }这个exclude属性排除的是自动配置类而不是普通的Component。理解这一点很重要它帮助你区分了“排除Bean”和“排除自动配置逻辑”两个层面。排查技巧当你发现一个不该出现的Bean出现了或者该出现的Bean没出现时按以下步骤排查检查启动类及所有Import的配置类上的ComponentScan注解。检查是否有通过SpringBootApplication.exclude排除了关键的自动配置。使用--debug模式启动应用SpringBoot会打印一份完整的自动配置报告显示哪些配置类生效了哪些因为各种条件包括排除没有生效。在IDE中使用“Find Usages”功能查找这个Bean的类名看它是在哪个配置类中被Bean定义的或者它自身的注解扫描路径是否被你的过滤器覆盖。5. 高级应用与性能调优考量掌握了基本用法我们来看看一些高级场景和需要注意的性能问题。5.1 动态过滤基于Profile或配置的排除有时我们希望在特定环境如测试环境下排除某些组件。这可以通过结合Profile注解和excludeFilters来实现但更优雅的方式是使用CUSTOMTypeFilter。示例实现一个依赖配置的动态过滤器public class ProfileBasedExcludeFilter implements TypeFilter, EnvironmentAware { private Environment environment; Override public void setEnvironment(Environment environment) { this.environment environment; } Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) { // 获取当前激活的Profile String[] activeProfiles environment.getActiveProfiles(); boolean isTestEnv Arrays.stream(activeProfiles).anyMatch(p - p.equals(test)); if (isTestEnv) { // 在测试环境下排除所有标注了ProductionOnly的组件 AnnotationMetadata annotationMetadata metadataReader.getAnnotationMetadata(); return annotationMetadata.hasAnnotation(com.example.annotation.ProductionOnly); } return false; // 非测试环境不过滤 } }然后在配置中启用这个过滤器即可。这样当应用以testprofile启动时所有标记为ProductionOnly的类都会被自动排除。5.2 对启动性能的影响分析与优化组件扫描是SpringBoot启动过程中比较耗时的阶段之一尤其是项目庞大、依赖众多时。excludeFilters本身会增加扫描器的判断逻辑但通常开销很小。影响性能的主要因素是扫描路径的广度basePackages设置得越宽泛需要检查的.class文件就越多。过滤器的复杂度CUSTOM过滤器如果逻辑复杂或者ASPECTJ/REGEX表达式非常复杂会对每个候选类都执行一次累积起来就有影响。优化建议精确扫描路径尽量使用basePackages或basePackageClasses限定扫描范围不要总是用默认的“启动类所在包”。优先使用简单过滤器ANNOTATION和ASSIGNABLE_TYPE通常比ASPECTJ和REGEX更快因为后者涉及模式匹配。缓存过滤结果在复杂的自定义过滤器中可以考虑对匹配结果进行缓存例如使用ConcurrentHashMap缓存类名到匹配结果的映射但要注意类加载器的问题和内存开销。延迟加载考虑对于确实非常耗时且非必需的过滤器可以评估是否能用Lazy注解代替排除。Lazy的Bean在第一次被请求时才初始化虽然不减少扫描开销但可以加快启动速度。5.3 在Spring Boot Test中的特殊用法在单元测试或集成测试中我们经常需要排除一些真实的Bean注入Mock对象。SpringBootTest注解也提供了excludeFilters属性但其作用域仅限于当前测试上下文。SpringBootTest ComponentScan(excludeFilters Filter(type FilterType.ASSIGNABLE_TYPE, classes RealEmailService.class)) public class MyServiceTest { MockBean private EmailService emailService; // 这里会注入一个Mock而不是被排除的RealEmailService Autowired private MyService myService; Test public void testSomething() { // 测试逻辑 } }这在测试中非常有用可以精准地构建一个干净的、只包含必要组件的测试环境。记住测试中的ComponentScan配置会覆盖主应用中的默认扫描行为但只对当前测试类生效。6. 常见问题排查与实战案例最后我们通过几个真实的案例和问题来巩固对excludeFilters的理解。6.1 典型问题排查清单问题现象可能原因排查步骤排除过滤器不生效Bean依然被创建1. 过滤器配置位置错误未被扫描到。2. 过滤器类型(FilterType)或表达式写错。3. Bean是通过Bean方法手动注册的而非类路径扫描。4. 该Bean由其他自动配置类导入而你的过滤器只作用于主扫描路径。1. 确认ComponentScan注解所在的配置类已被加载。2. 开启DEBUG日志查看扫描过程。3. 检查Bean的定义方式是Component还是Bean。4. 检查自动配置报告看Bean来源。误排除了需要的Bean1.ASSIGNABLE_TYPE排除了基类/接口误伤子类。2.ASPECTJ或REGEX表达式过于宽泛。3. 多个excludeFilters产生了意外的叠加效果。1. 复查过滤逻辑特别是继承和实现关系。2. 使用更精确的表达式或改用ANNOTATION。3. 逐一禁用过滤器定位是哪个规则导致的问题。启动变慢1. 扫描路径(basePackages)过大。2. 自定义TypeFilter逻辑复杂性能差。3. 项目依赖过多类路径下.class文件数量巨大。1. 缩小扫描范围。2. 优化自定义过滤器算法考虑缓存。3. 使用spring.context.index类路径索引加速扫描Spring Boot特性。6.2 实战案例解决依赖冲突背景项目A依赖了库X1.0版本和库Y而库Y又传递依赖了库X2.0版本。两个版本的库X都提供了一个名为GlobalConfig的配置类且包名相同。应用启动时由于类路径上存在两个同名的Class文件Spring在扫描时可能加载到错误的版本或直接报BeanDefinitionOverrideException。解决方案使用excludeFilters精确排除我们不想用的那个版本的配置类。假设我们想用1.0版本的GlobalConfig。首先需要确定2.0版本的GlobalConfig类的全限定名。可以通过Maven依赖树或IDE查看。假设2.0版本的类在com.libx.v2.config包下。SpringBootApplication ComponentScan(excludeFilters { ComponentScan.Filter(type FilterType.ASPECTJ, pattern com.libx.v2.config.GlobalConfig) }) public class Application { // 这样只有1.0版本的GlobalConfig会被扫描到 }如果两个版本在同一个包下仅靠类名无法区分那就需要更复杂的手段比如使用CUSTOM过滤器通过读取类文件的元数据如注解版本号来判断或者从根本上解决依赖冲突使用Maven的exclusion。6.3 与Conditional注解的对比与选择Conditional系列注解如ConditionalOnClass,ConditionalOnMissingBean,ConditionalOnProperty和excludeFilters都能控制Bean的注册但它们的工作阶段和粒度不同。excludeFilters工作在组件扫描阶段在Bean定义被创建之前。它基于类的静态信息类名、注解、继承关系进行排除是一种“物理”排除。Conditional工作在Bean定义注册阶段。它允许基于动态条件类路径是否存在某个类、容器中是否已有某个Bean、配置属性值等来决定是否注册这个Bean。是一种“逻辑”条件化装配。如何选择当你明确知道要排除某个或某类具体的、不需要的类时用excludeFilters。尤其是排除第三方库中“捣乱”的类这是最直接有效的方法。当Bean的注册需要依赖运行时的环境或条件时用Conditional。例如“如果存在RedisConnectionFactory这个类才注册RedisTemplate这个Bean”。很多时候它们是互补的。你可以在自动配置类里用ConditionalOnClass判断条件同时在主应用扫描中用excludeFilters排除某些冲突的配置类。掌握ComponentScan excludeFilters意味着你拿到了Spring IoC容器大门的一把关键钥匙。它能帮你解决依赖冲突、实现模块隔离、优化启动速度是构建整洁、可控的SpringBoot应用不可或缺的技能。下次当你的应用因为一个不请自来的Bean而启动失败时别再只会满世界找Autowired的冲突了试试用excludeFilters把它精准地“请”出去。

相关新闻

比亚迪发AI论文:HyWorldVLA达SOTA,展现物理AI基础模型研发能力!

比亚迪发AI论文:HyWorldVLA达SOTA,展现物理AI基础模型研发能力!

比亚迪发布HyWorldVLA论文:开启自动驾驶新探索 比亚迪汽车新技术研究院公开了一篇名为HyWorldVLA的论文,该论文瞄准当前自动驾驶最热门的方向——Vision - Language - Action(VLA) World Model(世界模型)。…

2026/7/30 7:37:13 阅读更多 →
PTA编程题“念数字”详解:字符串与递归解法及格式控制技巧

PTA编程题“念数字”详解:字符串与递归解法及格式控制技巧

1. 项目概述:从“念数字”看PTA编程题的解题心法最近在辅导一些同学准备程序设计类考试和刷题,发现很多人对PTA(Programming Teaching Assistant,程序设计类实验辅助教学平台)上的题目感到头疼,尤其是那些看…

2026/7/30 7:36:13 阅读更多 →
Allegro PCB设计:掌握图形层快速切换技巧,提升批量操作效率

Allegro PCB设计:掌握图形层快速切换技巧,提升批量操作效率

1. 项目概述:一个被低估的效率痛点在Allegro PCB设计软件里,有一个操作几乎每天都会发生,但很多人却用着最原始、最耗时的方法——那就是在不同层之间切换图形元素。想象一下这个场景:你正在布局一块复杂的多层板,突然…

2026/7/30 7:36:13 阅读更多 →

最新新闻

MHmarkets:用清单方式看外汇市场服务体验,更容易形成稳定判断

MHmarkets:用清单方式看外汇市场服务体验,更容易形成稳定判断

在外汇相关服务里,MHmarkets是否值得长期关注,往往取决于几个清晰的体验点:说明是否好理解、提示是否到位、流程是否连贯、支持是否稳定。下面从这些维度对MHmarkets做一次正向梳理与要点归纳。在外汇相关服务中,读者最在意的通常…

2026/7/31 2:02:10 阅读更多 →
STM32定时器硬件同步:多轴电机控制与数据采集的精准时序解决方案

STM32定时器硬件同步:多轴电机控制与数据采集的精准时序解决方案

1. 项目缘起:为什么我们需要多个定时器同步启动?在嵌入式开发,尤其是基于STM32这类高性能MCU的项目中,我们常常会遇到一个看似简单却至关重要的需求:让多个定时器在同一时刻、分毫不差地开始计数。你可能觉得&#xff…

2026/7/31 2:02:10 阅读更多 →
Kimi    LeetCode 3791. 给定范围内平衡整数的数目 Python3实现

Kimi LeetCode 3791. 给定范围内平衡整数的数目 Python3实现

以下是 LeetCode 3791. 给定范围内平衡整数的数目 的 Python3 实现。题目理解一个整数是平衡的&#xff0c;当且仅当&#xff1a; 1. 至少包含两位数字 2. 奇数位数字之和等于偶数位数字之和&#xff08;最左边数字位置为1&#xff09;约束&#xff1a;1 < low < high &l…

2026/7/31 2:02:10 阅读更多 →
2FAuth安全架构深度解析:从数据加密到RFC合规的实战指南

2FAuth安全架构深度解析:从数据加密到RFC合规的实战指南

1. 项目概述&#xff1a;为什么我们需要重新审视2FAuth的安全性&#xff1f;最近在部署和审计内部的双因素认证系统时&#xff0c;我花了大量时间深入研究一个开源项目&#xff1a;2FAuth。它不仅仅是一个简单的TOTP令牌生成器&#xff0c;其设计背后蕴含了许多对安全性和合规性…

2026/7/31 2:02:10 阅读更多 →
国产SPI Flash在Linux系统下的驱动适配与移植实战

国产SPI Flash在Linux系统下的驱动适配与移植实战

1. 项目概述&#xff1a;当国产平台遇上国产Flash最近在基于复旦微电子的FMQL系列平台&#xff08;可以理解为国产化的ZYNQ&#xff09;进行Linux系统开发时&#xff0c;遇到了一个挺典型但又有点棘手的问题&#xff1a;系统引导程序U-Boot和Linux内核无法正确识别板载的国产SP…

2026/7/31 2:02:10 阅读更多 →
GoF设计模式——建造者模式

GoF设计模式——建造者模式

h5打开以查看 为什么需要建造者模式? 在 GoF设计模式——抽象工厂模式 中,抽象工厂解决了"一族产品要风格统一"的问题——一个工厂负责一整套产品,选了工厂就等于选了整套风格。 但不管是工厂方法还是抽象工厂,都只管"产出什么",不管"怎么一步…

2026/7/31 2:01:10 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制&#xff0c;分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件&#xff0c;物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB&#xff08;云原生数据库&#xff09;采用物理复制&#xff0c;在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown&#xff1a;3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前&#xff0c;游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据&#xff0c;中国AI游戏云市场规模已达18.6亿元&#xff1b;同时&#xff0c;游戏研发环节AI渗透率高达86%&#xff0c;生成式AI内容普及率超过50%。面对庞大的市场&#xff0c;游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻