Refresh 方法

本文介绍了 ADO 中 Refresh 方法的功能及用途,包括如何通过 Command 对象的 Parameters 集合更新存储过程参数信息,以及在 Fields 和 Properties 集合中的应用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Refresh 方法

 

更新集合中的对象以便反映来自提供者的可用对象和特定于提供者的对象。

语法

collection.Refresh

说明

Refresh 方法根据从中调用的不同集合而完成不同的任务。

参数

使用 Command 对象的 Parameters 集合上的 Refresh 方法可为在 Command 对象中指定的存储过程或者参数化查询检索提供者端参数信息。对于不支持存储过程调用或参数化查询的提供者来说,集合将为空。

在调用 Refresh 方法之前应该将 Command 对象的 ActiveConnection 属性设置为有效 Connection 对象,将 CommandText 属性设置为有效命令,并且将 CommandType 属性设置为 adCmdStoredProc

如果在调用 Refresh 方法之前访问 Parameters 集合,ADO 将自动调用方法并填充集合。

注意   如果使用 Refresh 方法从提供者获取参数信息而它返回一个或多个变长数据类型 Parameter 对象,则 ADO 可能根据其大小的最大可能值为参数分配内存,这在执行期间将会导致错误。在调用 Execute 方法之前应显式设置这些参数的 Size 属性以防止错误发生。

Fields

Fields 集合上使用 Refresh 方法没有可见的效果。要从基本数据库结构中对更改进行检索,必须使用 Requery 方法;如果 Recordset 对象不支持书签,则使用 MoveFirst 方法。

Properties

在某些对象的 Properties 集合上使用 Refresh 方法可使用提供者提供的动态属性填写集合,这些属性只将功能性信息提供给 ADO 支持的内置属性之外的提供者。

 
<think>我们正在讨论Spring框架中的`refresh()`方法。根据用户的问题,我们需要解释`refresh()`方法的用途和使用方式。首先,我们需要明确`refresh()`方法在Spring框架中的位置和作用。 在Spring框架中,`refresh()`方法是`AbstractApplicationContext`类中的一个核心方法。该方法负责初始化或刷新Spring应用上下文,加载或重新加载配置信息,并创建和管理Bean的生命周期。 ### 用途 1. **初始化应用上下文**:当应用上下文创建后,调用`refresh()`方法会初始化所有的单例Bean,并完成依赖注入。 2. **重新加载配置**:在已经存在的应用上下文中,调用`refresh()`方法可以重新加载配置(例如,修改了配置文件后),并重新初始化Bean。 3. **启动和停止**:该方法还会触发生命周期处理器(Lifecycle Processor)的启动,以及注册的Shutdown Hook。 ### 使用方式 通常,我们不会直接调用`refresh()`方法,因为在使用应用上下文(如`ClassPathXmlApplicationContext`或`AnnotationConfigApplicationContext`)时,构造方法内部已经调用了`refresh()`方法。但是,在某些情况下,比如需要重新加载配置时,我们可以显式调用。 #### 示例代码 ```java // 创建应用上下文 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(AppConfig.class); // 调用refresh方法初始化 context.refresh(); // 使用上下文获取Bean MyService myService = context.getBean(MyService.class); // 如果需要重新加载(例如,在外部配置变更后) context.refresh(); // 注意:再次调用refresh()会销毁所有已创建的Bean并重新初始化 // 关闭上下文 context.close(); ``` ### 注意事项 - 多次调用`refresh()`方法会导致之前创建的Bean被销毁,然后重新创建。因此,需要谨慎使用,以避免资源浪费和状态丢失。 - 在调用`refresh()`之前,必须注册配置类或XML配置位置。 - 调用`refresh()`后,应用上下文处于活动状态,可以获取Bean。使用完毕后,应调用`close()`方法关闭上下文以释放资源。 ### 内部流程 `refresh()`方法内部执行多个步骤,包括: 1. 准备刷新(Prepare refresh):初始化上下文环境,验证必要的属性等。 2. 获取新的BeanFactory(Obtain fresh bean factory):创建或刷新内部的BeanFactory。 3. 准备BeanFactory(Prepare the bean factory):配置BeanFactory的标准上下文特性(如类加载器、后置处理器等)。 4. 后置处理BeanFactory(Post-process the bean factory):允许在Bean加载前对BeanFactory进行修改(通过子类实现)。 5. 调用BeanFactory的后置处理器(Invoke bean factory post processors):处理BeanFactoryPostProcessor,用于修改Bean定义。 6. 注册Bean的后置处理器(Register bean post processors):注册BeanPostProcessor,用于在Bean创建过程中进行拦截处理。 7. 初始化消息源(Initialize message source):用于国际化。 8. 初始化事件广播器(Initialize event multicaster):用于事件发布。 9. 初始化其他特殊的Bean(On refresh):由子类实现,用于初始化特定的Bean。 10. 注册监听器(Register listeners):注册事件监听器。 11. 完成BeanFactory的初始化(Finish bean factory initialization):初始化所有剩余的单例Bean(非延迟初始化)。 12. 完成刷新(Finish refresh):发布ContextRefreshedEvent事件,完成刷新过程。 ### 引用说明 在Spring框架中,`refresh()`方法是应用上下文初始化的核心方法,它定义在`AbstractApplicationContext`类中[^2]。另外,在初始化消息源时,我们可以配置`ResourceBundleMessageSource`来支持国际化[^1]。 §§相关问题§§ 1. `refresh()`方法在Spring框架中定义在哪个类中? 2. 调用`refresh()`方法多次会有什么后果? 3. 在`refresh()`方法执行过程中,哪些步骤允许开发者进行扩展? 4. 如何监听Spring上下文刷新完成的事件?</think>### Spring框架中`refresh()`方法的用途及使用方式 `refresh()`方法是Spring框架中**应用上下文(ApplicationContext)初始化的核心方法**,定义在`AbstractApplicationContext`类中[^2]。其主要用途和执行流程如下: #### 一、核心用途 1. **初始化应用上下文** 加载配置元数据(XML/注解/Java Config),创建并管理Bean实例,完成依赖注入(DI)和生命周期管理。 2. **刷新内部状态** 重新加载配置(如热部署场景),销毁旧Bean并创建新实例,更新应用状态。 3. **启动扩展点** 触发`BeanFactoryPostProcessor`(修改Bean定义)、`BeanPostProcessor`(拦截Bean初始化)等扩展机制。 4. **发布事件** 完成刷新后发布`ContextRefreshedEvent`事件,通知监听器(如启动定时任务)。 #### 二、使用方式 ##### 1. 显式调用场景 ```java // 创建应用上下文(默认未刷新) AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); // 注册配置类 ctx.refresh(); // 关键:触发初始化流程 // 重新加载配置(如配置文件更新后) ctx.refresh(); // 销毁旧Bean,重建新实例 ``` ##### 2. 隐式调用场景 ```java // 常用上下文实现类会在构造函数中自动调用refresh() ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); // 内部已调用refresh ``` #### 三、执行流程(关键步骤) ```mermaid graph TD A[开始refresh] --> B[准备刷新<br>Prepare Refresh] B --> C[初始化BeanFactory<br>Obtain Fresh BeanFactory] C --> D[配置BeanFactory<br>Prepare BeanFactory] D --> E[执行BeanFactory后处理器<br>PostProcessBeanFactory] E --> F[注册Bean后处理器<br>RegisterBeanPostProcessors] F --> G[初始化消息源<br>InitMessageSource] G --> H[初始化事件广播器<br>InitApplicationEventMulticaster] H --> I[子类扩展点<br>onRefresh] I --> J[注册监听器<br>RegisterListeners] J --> K[实例化单例Bean<br>FinishBeanFactoryInitialization] K --> L[完成刷新<br>FinishRefresh] L --> M[发布ContextRefreshedEvent] ``` #### 四、注意事项 1. **单次上下文生命周期** 通常只调用一次`refresh()`,多次调用需配合`close()`释放资源。 2. **资源管理** 调用`refresh()`后必须显式调用`close()`(或在try-with-resources中)避免内存泄漏。 3. **线程安全** 非线程安全方法,需在完全初始化的上下文中调用。 #### 五、典型应用场景 - **热部署**:动态重载配置时调用`refresh()` - **测试环境**:在单元测试中手动控制上下文生命周期 - **自定义扩展**:通过覆盖`onRefresh()`实现容器扩展[^2] > 引用说明: > [^1] 消息源初始化在`refresh()`流程中通过`ResourceBundleMessageSource`实现国际化支持。 > [^2] `refresh()`方法定义在`AbstractApplicationContext`中,是上下文初始化的核心入口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值