Spring Bean加载流程详解

news/2026/1/26 12:46:28/文章来源:https://www.cnblogs.com/guoyafenghome/p/19532717

Spring Bean加载流程详解

Spring Bean的加载流程可以分成两个大阶段:容器启动阶段Bean实例化阶段

整体流程概览

容器启动:
1. 加载配置(XML、注解、Java配置)
2. 解析配置,生成BeanDefinition
3. BeanDefinition注册到BeanFactoryBean实例化(延迟或立即):
4. 实例化Bean(反射创建对象)
5. 属性填充(依赖注入)
6. 初始化(各种回调)
7. 放入单例池
8. Bean可以使用了Bean销毁:
9. 容器关闭时,执行销毁回调

下面我详细展开每一步。


第一阶段:容器启动阶段

步骤1:加载配置文件

Spring支持三种配置方式,都会在容器启动时加载。

方式1:XML配置(传统方式)

<beans><bean id="userService" class="com.example.UserService"><property name="userDao" ref="userDao"/></bean>
</beans>

容器启动时,Spring会:

  • 读取XML文件
  • 解析XML标签
  • 生成BeanDefinition

方式2:注解配置(最常用)

@Configuration
@ComponentScan("com.example")
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}
}

容器启动时,Spring会:

  • 扫描@ComponentScan指定的包
  • 找到@Component、@Service、@Repository等注解
  • 解析@Bean方法
  • 生成BeanDefinition

方式3:SpringBoot自动配置

SpringBoot会:

  • 扫描starter包的META-INF/spring.factories
  • 加载@EnableAutoConfiguration指定的配置类
  • 根据条件注解(@ConditionalOnClass等)决定是否生效

实际项目中:

我们现在的项目基本都用注解配置:

  • 简洁明了
  • 类型安全
  • 便于重构

步骤2:解析BeanDefinition

什么是BeanDefinition?

BeanDefinition是Bean的"设计图纸"或"元数据",描述了如何创建Bean。

BeanDefinition包含的信息:

  • beanClass - Bean的类型(如com.example.UserService)
  • scope - 作用域(singleton、prototype等)
  • lazyInit - 是否懒加载
  • dependsOn - 依赖的Bean
  • initMethodName - 初始化方法名
  • destroyMethodName - 销毁方法名
  • propertyValues - 属性值
  • constructorArgumentValues - 构造器参数

解析过程:

@Service注解 → BeanDefinitionReader读取↓创建BeanDefinition对象↓设置beanClass=UserService设置scope=singleton设置lazyInit=false...

形象理解:

BeanDefinition就像建筑图纸:

  • 图纸说明了房子怎么盖(但房子还没盖)
  • 包含了所有建筑信息
  • 真正的房子(Bean实例)还没创建

步骤3:注册BeanDefinition

BeanDefinition注册到BeanDefinitionRegistry,实际上是一个Map。

注册过程:

// 伪代码
Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();// 注册
beanDefinitionMap.put("userService", userServiceBeanDefinition);

此时:

  • 配置已加载
  • BeanDefinition已生成
  • 但Bean实例还没创建
  • 只是有了"图纸"

这是容器启动阶段,很快,通常几百毫秒。


第二阶段:Bean实例化阶段

步骤4:实例化Bean

实例化就是创建Bean的实例对象,主要通过反射。

实例化时机:

立即实例化(eager):

  • 单例Bean默认在容器启动时实例化
  • 可以提前发现问题

延迟实例化(lazy):

  • 第一次getBean时才实例化
  • 加快容器启动速度

实例化方式:

方式1:构造器实例化(最常用)

@Service
public class UserService {public UserService() {// 无参构造器}
}// Spring通过反射调用构造器:
UserService bean = UserService.class.newInstance();

方式2:构造器注入

@Service
public class UserService {private final UserDao userDao;// Spring会调用这个构造器,注入依赖public UserService(UserDao userDao) {this.userDao = userDao;}
}

方式3:工厂方法实例化

@Configuration
public class AppConfig {@Beanpublic UserService userService() {// Spring调用这个方法创建Beanreturn new UserService();}
}

方式4:FactoryBean实例化

public class MyFactoryBean implements FactoryBean<UserService> {@Overridepublic UserService getObject() {// Spring调用这个方法获取Beanreturn new UserService();}
}

此时:

  • Bean对象已创建(new出来了)
  • 但属性还是null(还没注入)
  • 还没初始化

步骤5:属性填充(依赖注入)

属性填充就是依赖注入的过程,给Bean的属性赋值。

Spring会扫描Bean的属性:

@Service
public class UserService {@Autowiredprivate UserDao userDao;  // 需要注入@Value("${app.name}")private String appName;  // 需要注入
}

注入过程:

1. 发现@Autowired注解↓
2. 从容器中查找UserDao类型的Bean↓
3. 如果找到,通过反射设置字段值field.set(userService, userDaoBean)↓
4. 发现@Value注解↓
5. 从环境变量或配置文件读取值↓
6. 设置字段值

注入方式:

字段注入:

@Autowired
private UserDao userDao;

Setter注入:

@Autowired
public void setUserDao(UserDao userDao) {this.userDao = userDao;
}

构造器注入(推荐):

public UserService(UserDao userDao) {this.userDao = userDao;
}

注入时机:

  • 在实例化之后
  • 在初始化之前
  • 此时对象已创建,开始注入依赖

循环依赖的处理:

如果A依赖B,B依赖A:

  • Spring用三级缓存解决
  • 提前暴露正在创建的Bean
  • 后面我可以详细展开

此时:

  • Bean对象已创建
  • 属性已注入
  • 但还没初始化

步骤6:初始化Bean(重点!)

这是Bean加载流程中最复杂的部分,涉及很多回调接口。按执行顺序来说:

完整的初始化流程(9个步骤):

1. Aware接口回调(注入Spring内部对象)

如果Bean实现了这些接口,Spring会回调:BeanNameAware.setBeanName() → 注入Bean的名字BeanClassLoaderAware.setBeanClassLoader() → 注入类加载器BeanFactoryAware.setBeanFactory() → 注入BeanFactoryApplicationContextAware.setApplicationContext() → 注入ApplicationContext(最常用)

实际例子:

@Component
public class MyBean implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext context) {// Spring会自动调用,注入ApplicationContextthis.context = context;}public void doSomething() {// 可以通过context获取其他BeanOtherBean bean = context.getBean(OtherBean.class);}
}

2. BeanPostProcessor前置处理

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 在Bean初始化之前调用// 可以修改Bean、替换BeanSystem.out.println("Before init: " + beanName);return bean;}
}

这个方法会在所有Bean初始化前调用。

3. @PostConstruct注解方法

@Service
public class UserService {@PostConstructpublic void init() {// Spring会自动调用这个方法System.out.println("UserService初始化");// 做一些初始化工作}
}

这是JSR-250标准,我们项目中最常用的初始化方式。

4. InitializingBean接口

@Service
public class UserService implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// Spring会自动调用System.out.println("属性设置完成后调用");}
}

这是Spring自己的接口。

5. init-method(配置的初始化方法)

@Bean(initMethod = "customInit")
public UserService userService() {return new UserService();
}// UserService中
public void customInit() {// Spring会调用这个方法System.out.println("自定义初始化方法");
}

6. BeanPostProcessor后置处理

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {// 在Bean初始化之后调用// 这里可以创建代理对象(AOP就是在这里生成代理的)System.out.println("After init: " + beanName);return bean;  // 或返回代理对象
}

AOP的代理对象就是在这个阶段生成的!

完整的初始化顺序(重要,面试常问):

1. BeanNameAware.setBeanName()
2. BeanClassLoaderAware.setBeanClassLoader()
3. BeanFactoryAware.setBeanFactory()
4. ApplicationContextAware.setApplicationContext()↓
5. BeanPostProcessor.postProcessBeforeInitialization()↓
6. @PostConstruct方法↓
7. InitializingBean.afterPropertiesSet()↓
8. init-method方法↓
9. BeanPostProcessor.postProcessAfterInitialization()(生成代理)

我的记忆口诀:

Aware注入内部对象 → 前置处理 → @PostConstruct → InitializingBean → init-method → 后置处理(生成代理)

实际经验:

我们项目中最常用的是@PostConstruct:

  • 简单直观
  • 标准注解
  • 不需要实现接口

比如:

  • 初始化缓存
  • 预加载数据
  • 建立连接

步骤7:注册到单例池

初始化完成后,Spring会把Bean放入单例池(一个Map)。

单例池:

// 伪代码
Map<String, Object> singletonObjects = new ConcurrentHashMap<>();// 注册
singletonObjects.put("userService", userServiceBean);

此时:

  • Bean完全创建好了
  • 依赖已注入
  • 已初始化
  • 可以使用了

以后getBean()时:

  • 直接从单例池拿
  • 不会再创建新的
  • 除非是prototype作用域

步骤8:Bean可以使用

放入单例池后就可以使用了。

使用方式:

方式1:依赖注入(推荐)

@Service
public class OrderService {@Autowiredprivate UserService userService;  // Spring自动注入
}

方式2:手动获取

ApplicationContext context = ...;
UserService userService = context.getBean(UserService.class);

实际项目中:

  • 99%用依赖注入
  • 1%特殊场景手动获取(如动态获取Bean)

第二阶段:Bean销毁阶段

步骤9:销毁Bean

当容器关闭时(如应用停止),Spring会销毁Bean。

销毁顺序(和初始化相反):

1. @PreDestroy方法↓
2. DisposableBean.destroy()↓
3. destroy-method方法

实际例子:

@Service
public class DatabaseService {private Connection connection;@PostConstructpublic void init() {// 初始化:建立连接connection = dataSource.getConnection();}@PreDestroypublic void cleanup() {// 销毁:关闭连接if (connection != null) {connection.close();}}
}

我的实际使用:

我们在@PreDestroy方法中:

  • 关闭数据库连接
  • 关闭线程池
  • 清理缓存
  • 释放资源

Spring优雅停机:

  • 收到停止信号
  • 不再接受新请求
  • 等待现有请求处理完
  • 执行@PreDestroy
  • 关闭容器

第三部分:Bean生命周期完整流程图

下面是完整的Bean生命周期流程图:

【容器启动阶段】
1. 加载配置├─ XML配置├─ 注解配置└─ 自动配置↓
2. 解析BeanDefinition├─ 解析@Component等注解├─ 解析@Bean方法└─ 生成BeanDefinition对象↓
3. 注册BeanDefinition└─ 放入beanDefinitionMap【Bean实例化阶段】
4. 实例化Bean├─ 推断构造器├─ 通过反射调用构造器└─ 创建Bean对象(属性都是null)↓
5. 属性填充(依赖注入)├─ 解析@Autowired注解├─ 从容器获取依赖Bean├─ 通过反射设置属性└─ 处理@Value注入↓
6. Aware接口回调├─ BeanNameAware├─ BeanFactoryAware└─ ApplicationContextAware↓
7. BeanPostProcessor前置处理└─ postProcessBeforeInitialization()↓
8. 初始化├─ @PostConstruct方法├─ InitializingBean.afterPropertiesSet()└─ init-method↓
9. BeanPostProcessor后置处理├─ postProcessAfterInitialization()└─ 【重要】生成代理对象(AOP)↓
10. 注册到单例池└─ singletonObjects.put(beanName, bean)↓
11. Bean可以使用└─ getBean()直接返回【Bean销毁阶段】
12. 容器关闭├─ @PreDestroy方法├─ DisposableBean.destroy()└─ destroy-method↓
13. 从单例池移除└─ singletonObjects.remove(beanName)

这就是一个Bean从创建到销毁的完整生命周期!


第四部分:三级缓存与循环依赖

Spring通过三级缓存来解决循环依赖,这是Bean加载流程中的一个重要机制。

什么是循环依赖?

@Service
public class A {@Autowiredprivate B b;  // A依赖B
}@Service  
public class B {@Autowiredprivate A a;  // B依赖A
}// A需要B,B需要A,循环了

三级缓存:

// 一级缓存:单例池(成品Bean)
Map<String, Object> singletonObjects = new ConcurrentHashMap<>();// 二级缓存:早期Bean引用(半成品Bean)
Map<String, Object> earlySingletonObjects = new HashMap<>();// 三级缓存:Bean工厂(用于创建代理)
Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>();

解决循环依赖的流程:

创建A:
1. 实例化A(对象已创建,属性为null)
2. 把A的工厂放入三级缓存
3. 填充A的属性,发现需要B↓创建B:4. 实例化B5. 把B的工厂放入三级缓存6. 填充B的属性,发现需要A7. 从缓存获取A:- 一级缓存没有(A还没完全创建好)- 二级缓存没有- 三级缓存有!取出A的工厂,创建A的代理- 把A的代理放入二级缓存- 返回A的代理给B8. B创建完成,放入一级缓存↓
9. A拿到B,继续创建
10. A创建完成,放入一级缓存

关键点:

  • 提前暴露正在创建的Bean(通过三级缓存)
  • B注入的是A的早期引用(可能是代理对象)
  • 最终A和B都创建成功

但有限制:

  • 只能解决单例Bean的循环依赖
  • 不能解决构造器的循环依赖
  • 不能解决prototype的循环依赖

我的实际经验:

循环依赖在项目中偶尔会遇到:

  • 通常是设计不合理
  • 最好重构代码,避免循环依赖
  • 如果实在避免不了,Spring的三级缓存可以解决

第五部分:实战理解

下面结合实际代码来说明Bean的加载过程,这样更直观。

代码:

@Service
public class UserService implements ApplicationContextAware {@Autowiredprivate UserDao userDao;@Value("${app.version}")private String appVersion;private ApplicationContext context;public UserService() {System.out.println("1. 构造器执行");}@Overridepublic void setApplicationContext(ApplicationContext context) {System.out.println("2. ApplicationContextAware回调");this.context = context;}@PostConstructpublic void init() {System.out.println("3. @PostConstruct初始化");System.out.println("   userDao = " + userDao);System.out.println("   appVersion = " + appVersion);}@PreDestroypublic void destroy() {System.out.println("4. @PreDestroy销毁");}public void doWork() {System.out.println("5. Bean正常工作");}
}

执行顺序:

容器启动:
→ 扫描到@Service注解
→ 生成UserService的BeanDefinition
→ 注册到BeanDefinitionRegistry开始创建Bean:
→ 1. 构造器执行(实例化)
→ 属性填充:注入userDao(从容器获取)注入appVersion(从配置读取)
→ 2. ApplicationContextAware回调
→ BeanPostProcessor前置处理
→ 3. @PostConstruct初始化
→ BeanPostProcessor后置处理(生成代理)
→ 放入单例池Bean可用:
→ 5. Bean正常工作容器关闭:
→ 4. @PreDestroy销毁
→ 从单例池移除

输出:

1. 构造器执行
2. ApplicationContextAware回调
3. @PostConstruct初始化userDao = com.example.UserDao@12345appVersion = 1.0.0
5. Bean正常工作
...
4. @PreDestroy销毁

这就是一个完整的Bean生命周期!


第六部分:高频问题解答

问题1:Bean是什么时候创建的?

单例Bean:

  • 默认在容器启动时创建(eager)
  • 可以配置@Lazy延迟创建

prototype Bean:

  • 每次getBean()时创建
  • 不会放入单例池

实际项目中:

  • 单例Bean在应用启动时创建
  • 启动时间长一点,但运行时快
  • prototype用得很少

问题2:构造器、@PostConstruct、InitializingBean的执行顺序?

执行顺序(重要):

1. 构造器↓
2. @Autowired属性注入↓
3. @PostConstruct↓
4. InitializingBean.afterPropertiesSet()↓
5. init-method

为什么这个顺序?

  • 构造器:创建对象
  • 属性注入:注入依赖
  • @PostConstruct:可以使用注入的依赖了
  • InitializingBean:Spring接口
  • init-method:自定义方法

实际使用建议:

我一般只用@PostConstruct,因为:

  • 最简单直观
  • 是Java标准(JSR-250)
  • 不需要实现接口或配置

问题3:BeanPostProcessor是干什么的?

BeanPostProcessor是Bean的后置处理器,可以在Bean初始化前后做增强。

两个方法:

  • postProcessBeforeInitialization() - 初始化前
  • postProcessAfterInitialization() - 初始化后

典型应用:

1. AOP代理生成

AbstractAutoProxyCreator(AOP的实现):

postProcessAfterInitialization() {if (需要代理这个Bean) {创建代理对象返回代理对象}返回原始Bean
}

@Transactional、@Cacheable等都是在这里生成代理的!

2. 注解处理

@Autowired、@Value、@PostConstruct等注解的处理也是通过BeanPostProcessor实现的。

我的实际使用:

我们项目中自定义过BeanPostProcessor:

  • 处理自定义注解
  • 修改Bean的属性
  • 记录Bean创建日志

问题4:循环依赖是如何解决的?

通过三级缓存来解决,前面已经详细说明了。

核心机制:

  • 提前暴露正在创建的Bean
  • B可以拿到A的早期引用
  • 最终都创建成功

限制:

  • 只能解决单例的字段注入循环依赖
  • 不能解决构造器循环依赖(无法提前暴露)
  • 不能解决prototype循环依赖(不会缓存)

最佳实践:

循环依赖通常说明设计有问题,最好:

  • 重构代码
  • 提取公共依赖
  • 打破循环

第七部分:知识要点总结

回答Bean生命周期问题的要点

1. 先说整体流程

  • 分两个阶段:容器启动、Bean实例化
  • 主要步骤:实例化 → 属性填充 → 初始化 → 使用 → 销毁

2. 详细展开各步骤

  • 实例化:反射创建对象
  • 属性填充:依赖注入
  • 初始化:各种回调(重点说顺序)

3. 说明关键机制

  • 三级缓存解决循环依赖
  • BeanPostProcessor生成代理

4. 结合实际经验

  • 常用@PostConstruct做初始化
  • 常用@PreDestroy做清理

核心要点

说出完整的初始化顺序 - Aware回调 → 前置处理 → @PostConstruct → InitializingBean...

三级缓存机制 - Spring通过三级缓存解决循环依赖

代理生成时机 - AOP的代理是在BeanPostProcessor后置处理时生成的

源码理解 - 了解AbstractAutowireCapableBeanFactory的doCreateBean方法

实际经验 - 项目中常用@PostConstruct初始化缓存

常见误区

需要避免的错误理解:

❌ "Bean就是new出来的" - 太简单,忽略了复杂的生命周期
❌ "初始化就是调用init方法" - 不完整,初始化有多个步骤
❌ "循环依赖Spring会报错" - 不对,单例字段注入的循环依赖可以解决


第八部分:快速记忆

口诀记忆

Bean加载七步曲:

  • 一扫描,二解析,三注册定义
  • 四实例,五注入,六初始化
  • 七放池,可使用,销毁有回调

初始化六步骤:

  • Aware接口先回调,前置处理做准备
  • PostConstruct第一个,InitializingBean第二
  • init-method是第三,后置处理生成代理

三级缓存记忆:

  • 一级缓存存成品,二级缓存存半成品
  • 三级缓存存工厂,循环依赖靠它解

数字记忆

完整流程步骤数:

  • 容器启动:3步
  • Bean创建:9步
  • Bean销毁:3步
  • 总共:15步

初始化回调数:

  • Aware接口:4个
  • 初始化方法:3个(@PostConstruct、afterPropertiesSet、init-method)
  • BeanPostProcessor:2个(前置、后置)

附录:高频问题清单

以下是面试常问的问题:

基础问题

  1. ✅ Spring Bean的生命周期是什么?
  2. ✅ Bean是如何创建的?
  3. ✅ 什么是BeanDefinition?
  4. ✅ Bean什么时候实例化?

初始化相关

  1. ✅ Bean的初始化流程是什么?
  2. ✅ @PostConstruct、InitializingBean、init-method的执行顺序?
  3. ✅ Aware接口有哪些?什么时候回调?
  4. ✅ BeanPostProcessor是干什么的?
  5. ✅ AOP的代理是什么时候生成的?

循环依赖

  1. ✅ Spring如何解决循环依赖?
  2. ✅ 什么是三级缓存?
  3. ✅ 构造器循环依赖能解决吗?
  4. ✅ prototype循环依赖能解决吗?

销毁相关

  1. ✅ Bean如何销毁?
  2. ✅ @PreDestroy什么时候执行?

实战问题

  1. ✅ 你在项目中如何初始化Bean?
  2. ✅ 遇到过循环依赖吗?怎么解决的?
  3. ✅ 如何自定义Bean的创建过程?

本文档已经覆盖了所有这些问题!


总结:核心观点

观点1:理解Bean生命周期是理解Spring的关键

很多Spring的特性都建立在Bean生命周期之上:

  • 依赖注入
  • AOP
  • 事件机制
  • 生命周期回调

观点2:初始化顺序要记住

面试最常问的就是初始化顺序:

  • 构造器 → 属性注入 → Aware → 前置处理 → @PostConstruct → InitializingBean → init-method → 后置处理

观点3:三级缓存是循环依赖的关键

理解三级缓存,就理解了Spring如何解决循环依赖。这是面试的加分项。

观点4:代理生成在后置处理

AOP的代理对象是在BeanPostProcessor的后置处理阶段生成的。这是很多人不知道的。

观点5:@PostConstruct是最佳实践

虽然有多种初始化方式,但@PostConstruct是最推荐的:

  • 简单直观
  • Java标准
  • 最常用

我的核心理念:深入理解源码,但不死记硬背,关键是理解为什么这么设计。


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

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

相关文章

2026年天津春考培训学校推荐:备考场景深度评测与权威排名解析

随着春季高考在天津地区升学路径中的重要性日益凸显,考生与家庭对于专业化、系统化培训的需求正变得前所未有的迫切。面对市场上数量众多、宣传各异的培训学校,如何甄别出一家真正具备深厚教学积淀、能提供稳定升学保…

2026 深圳云南菜野生菌火锅测评 榜单推荐!深圳锦上花鲜菌馆 正宗云南野生菌火锅

又到了适合贴膘养生的秋冬季节!论滋补美味,深圳吃货圈的目光最近都被这家人气飙升的云南菜馆锁定了——‌锦上花鲜菌馆特色云南菜‌。作为一个资深菌菇爱好者,我愿称它为“野生菌火锅界的天花板”!凭借一口喝得出山…

笔记本vscode调用台式机的 WSL ssh

下载&#xff1a;https://github.com/PowerShell/Win32-OpenSSH/releases → 选择 OpenSSH-Win64.msi Start-Service sshd Set-Service -Name sshd -StartupType Automatic # 1. 安装 OpenSSH Server&#xff08;如果没装&#xff09; sudo apt update && sudo apt ins…

强烈安利!继续教育9款AI论文写作软件测评TOP9

强烈安利&#xff01;继续教育9款AI论文写作软件测评TOP9 2026年继续教育AI论文写作工具测评&#xff1a;精准选型&#xff0c;提升效率 在当前学术研究日益数字化的背景下&#xff0c;AI论文写作工具已成为科研工作者不可或缺的辅助工具。尤其对于继续教育领域的学习者与研究…

HTTP服务在GET数据时接口数据返回不完整导致页面加载画面显示不全

发生在23年时候遇到的一个故障,好久没更新博客园了,今年一直在忙其他事情,整理资料的时候突然看到之前整理的文档,索性拿出来发一下 一、问题现象 客户端访问HTTP服务,在GET数据时有部分接口数据返回不完整,导致…

2026年生物质颗粒生产线厂家权威推荐:绿色能源转型中的核心选择

随着国家"双碳"目标的深入推进,生物质能源产业迎来历史性发展机遇。作为将农林废弃物转化为高价值清洁能源的关键装备,生物质颗粒生产线市场需求持续增长,年增长率稳定在13%-16%,成为环保装备市场中增长…

分析排名前十的资深菌菇企业,浙江百兴食品产品特色多

本榜单依托全维度市场调研与真实行业口碑,深度筛选出十家标杆企业,为企业选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:浙江百兴食品有限公司 推荐指数:★★★★★ | 口碑评分:国内资深菌菇企业标杆…

2026年国内创新能力强的菌菇企业排名,菌菇企业市场占有率哪家高

2025年健康消费浪潮持续升温,菌菇产业作为大健康赛道的核心分支,其市场占有率、创新研发能力与服务品质已成为企业核心竞争力的关键指标。无论是全产业链布局的头部企业、深耕创新技术的专精品牌,还是聚焦细分场景的…

2026年成都靠谱的数据智能企业排名,高性价比公司怎么选择

2025年数据智能技术深度渗透产业全链路,企业对数据资产的整合能力、分析效率与AI应用落地速度,已成为拉开行业竞争力的核心壁垒。无论是打破数据孤岛的全域数据平台建设、驱动精准增长的智能分析工具,还是解决AI应用…

专业的少儿大脑潜能开发机构,天使英才教育靠谱推荐

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为家长选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:天使英才教育科技(北京)有限公司 推荐指数:★★★★★ | 口碑评分:国内专业…

2026年净化行业丰达净化排名及靠谱品牌推荐

2025年全球洁净产业持续升级,净化工程与净化材料供应已成为医药、电子、食品等制造领域保障生产安全、提升产品品质的核心支撑。无论是千级以上无尘车间的整体承建、高性能净化板的定制生产,还是全流程安装维护服务,…

Day5课件

最短路 一个联通图中有n个点,m条边。边有权值(可正可负),可有向可无向。给定起点s和终点t,在所以连接s到t的路径中寻找边的权值之和最小的路径,这就是最短路径问题。 单源最短路 给定图,求一个点到所有其它点的…

工业互联网新场景:将实时碳排数据集成到现有能源管理系统的三种方案

温馨提示&#xff1a;文末有资源获取方式~ 能源系统|能源系统源码|企业能源系统|企业能源系统源码|能源监测系统 先上干货&#xff01; 墙内仓库地址&#xff08;码云&#xff09;&#xff1a;https://gitee.com/guangdong122/energy-management 已同步更新到 github 仓库 一、…

AI辅助的开题报告模板,助你轻松搞定学术写作任务

AI开题报告工具对比速览 工具名称 核心功能 生成速度 适用场景 独特优势 AIbiye 全流程论文辅助 3-5分钟 从开题到定稿 深度学术逻辑构建 AIcheck 精准开题生成 2-3分钟 快速产出初稿 国内院校模板库 AskPaper 文献综述辅助 实时响应 研究现状分析 海量文献…

【项目开源】一个基于Spring Cloud Alibaba的充电桩运营管理后台

先上代码&#xff01;Gitee平台 温馨提示&#xff1a;文末有资源获取方式 一、简述 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 二、介绍 云…

基于STM32F103VET6外部中断的矩阵键盘高精度计算器实现

文章目录 1. 项目概述1.1 设计目标1.2 技术选型1.3 成果展示 2. 硬件设计2.1 矩阵键盘电路2.2 硬件连接 3. 开发环境搭建3.1 软件清单3.2 CubeMX配置步骤 4. 核心代码实现4.1 外部中断配置 (exti.c)4.2 键盘扫描算法 (keypad.c)4.3 高精度计算引擎 (calculator.c) 5. 系统整合与…

存储服务器大流量写入由于 Ring Buffer 设置不合理导致丢包、断流的处理

存储服务器大流量写入由于 Ring Buffer 设置不合理导致丢包、断流的处理 现象:业务使用某厂商的私有云对象存储方案来存储大量的数据,此前已有合作的成功经验,这是另外一批存储服务器组成新的对象存储集群供业务使用…

【日记】或许我只是接受不了要求(2543 字)

正文这两天玩地平线玩得忘乎所以了。前两天折腾手动挡加手动离合器,从零开始学。明明是一个驾照都没考的人……驾照没考先从游戏里学怎么开车是不是会带偏啊……早上带朋友混进了泳池。本来去了市体育馆,有公告说直到…

冰雪聚贤,智启新局——2026崇礼论坛凝聚AI长期主义共识

2026年1月23日至25日&#xff0c;以“向新而立”为主题的2026崇礼论坛在张家口崇礼太舞小镇成功举办。论坛由崇礼区人民政府指导&#xff0c;太舞滑雪小镇、甲子光年、破圈文化、智辰半导体联合主办&#xff0c;俞敏洪、周鸿祎、沙宝亮等近百位行业大咖齐聚&#xff0c;围绕AI落…

A2UI 技术原理深度解析:AI Agent 如何安全生成富交互 UI

本文深入解析 Google 开源的 A2UI 协议&#xff0c;探讨其核心架构、数据流设计以及为何它是 LLM 生成 UI 的最佳实践。 一、A2UI 是什么&#xff1f; A2UI (Agent-to-User Interface) 是 Google 于 2025 年开源的声明式 UI 协议。它解决了一个核心问题&#xff1a; 如何让 AI…