BeanFactoryAware ContextRefreshedEvent AbstractHandlerMethodAdapter

BeanFactoryAware

是Spring框架中的一个接口,它属于Spring的aware接口之一,用于将BeanFactory注入到实现了该接口的Bean中。当一个Bean实现了BeanFactoryAware接口时,它可以直接访问Spring容器,这样这个Bean就能根据需要进行查找、管理和操作其他Bean。

BeanFactoryAware接口定义了一个方法 setBeanFactory(BeanFactory beanFactory)。Spring容器在创建实现了这个接口的Bean时,会自动调用这个方法,将BeanFactory实例传入。

使用场景
BeanFactoryAware的使用场景通常包括:

示例代码
下面是一个实现了BeanFactoryAware接口的Bean的示例:

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

public class MyBean implements BeanFactoryAware {

private BeanFactory beanFactory;

@Override
public void setBeanFactory(BeanFactory beanFactory) {
    this.beanFactory = beanFactory;
}

public void doSomething() {
    // 使用beanFactory获取其他Bean
    MyOtherBean otherBean = beanFactory.getBean(MyOtherBean.class);
    otherBean.performAction();
}

}

注意事项
尽管BeanFactoryAware提供了灵活的操作手段,但是一般建议仅在必要的情况下使用它,因为它使得Bean与Spring容器耦合,降低了代码的清晰度和可测试性。在大多数情况下,推荐使用依赖注入的方式来管理Bean之间的依赖关系。
在此基础上,
如果想动态从容器中拿些实例做统一操作。可以写个方法用
@PostConstruct注解,然后获取到容器中的实例。

BeanFactoryUtils.beansOfTypeIncludingAncestors(beanFactory, III.class).values();

ContextRefreshedEvent

是Spring框架中的一个事件,它表示Spring应用程序上下文(ApplicationContext)已经被初始化或刷新。这意味着所有的Bean都已经被成功加载,后处理器都已经被调用,所有单例Bean都已经被实例化,完全准备好被使用。

何时会触发 ContextRefreshedEvent:
当调用 ConfigurableApplicationContext 接口的 refresh() 方法时,会触发这个事件。refresh() 方法会重新加载Spring容器的配置信息。
当Spring的XML配置文件被加载时,Spring容器被初始化或刷新。
当使用Java配置类 (@Configuration) 时,通过调用 AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 的 refresh() 方法。
当使用Spring Boot时,应用启动结束并且Spring应用上下文准备就绪时,也会触发这个事件。
监听 ContextRefreshedEvent 的场景:
初始化后的后处理:如果你需要在Spring容器启动并准备好之后执行某些操作,比如加载缓存、完成特定的初始化步骤、检查系统健康状态等。
触发应用逻辑:例如,启动应用程序的时候,你可能想要自动执行一些数据加载或启动后台进程。
条件性配置:在某些条件满足后,执行一些配置相关的操作,例如动态注册Bean或更改配置。
资源准备:在所有Bean都准备好之后,你可能需要准备一些必要的资源,比如建立数据库连接,启动网络服务器等。
监听 ContextRefreshedEvent 的一个Java配置示例:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class StartupApplicationListenerExample implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 在这里执行你的初始化逻辑
        System.out.println("容器刷新事件:ContextRefreshedEvent");
    }
}

在Spring Boot应用程序中,你也可以使用 @EventListener 注解来监听这个事件,如下所示:

‘’’

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class ContextRefreshedEventListener {

    @EventListener
    public void onContextRefreshed(ContextRefreshedEvent event) {
        // 在这里执行你的初始化逻辑
        System.out.println("容器刷新事件:ContextRefreshedEvent");
    }
}

‘’’

监听 ContextRefreshedEvent 通常可以确保你的初始化代码在Spring上下文完全准备好之后执行,这就意味着所有的Bean已经被加载,所有的依赖关系已经注入。

AbstractHandlerMethodAdapter

AbstractHandlerMethodAdapter 是Spring MVC框架中的一个抽象基类,用于支持处理请求的方法(通常指的是带有 @RequestMapping 注解的控制器方法)。这个类是 HandlerAdapter 接口的一个具体实现,它提供了一种适配器机制,允许Spring MVC框架与多种类型的请求处理方法(handler methods)协同工作。

功能
在Spring MVC中,HandlerAdapter 的角色是桥接 DispatcherServlet 和实际处理请求的控制器方法。DispatcherServlet 接收到HTTP请求后,会根据映射找到对应的处理器(handler),然后通过适配器来调用实际的处理方法。

AbstractHandlerMethodAdapter 的主要职责包括:

判断适配器是否支持给定的handler。
调用实际的处理方法,并返回一个 ModelAndView 对象,这个对象包含了视图名称和模型数据,用于渲染响应。
提供对请求的处理方法的预处理和后处理的扩展点。
工作原理
当 DispatcherServlet 调用 handle() 方法时,AbstractHandlerMethodAdapter 会判断它是否可以处理该请求对应的handler。如果可以,它会进一步调用 invokeHandlerMethod() 来执行实际的控制器方法。
invokeHandlerMethod() 通常会涉及到对控制器方法的参数解析、模型填充、数据绑定等操作,最终执行控制器方法并返回结果。
结果可能会被进一步处理,转换为 ModelAndView,然后由 DispatcherServlet 进行视图渲染和响应返回。
实现类
AbstractHandlerMethodAdapter 有几个重要的子类,它们提供了对不同类型处理方法的支持:

RequestMappingHandlerAdapter:支持带有 @RequestMapping 注解的方法。
其他自定义的适配器:开发者也可以自定义适配器来扩展对不同类型处理方法的支持。
示例使用
你一般不需要直接与 AbstractHandlerMethodAdapter 或其子类交互,因为Spring MVC框架会自动配置和使用它们。但是了解它的存在对于理解Spring MVC的请求处理机制是有帮助的。

如果你需要自定义请求的处理方式,可能会涉及到扩展 AbstractHandlerMethodAdapter 的子类,例如,你可能会覆盖 invokeHandlerMethod() 方法以添加自定义的逻辑。

public class CustomHandlerMethodAdapter extends RequestMappingHandlerAdapter {

@Override
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
                                           HttpServletResponse response,
                                           HandlerMethod handlerMethod) throws Exception {
    // 自定义逻辑
    // ...

    // 调用父类方法进行标准的请求处理
    return super.invokeHandlerMethod(request, response, handlerMethod);
}

}
结论
AbstractHandlerMethodAdapter 是Spring MVC内部机制的一部分,使得DispatcherServlet能够与各种handler方法进行交互。作为开发者,通常不需要直接与之打交道,除非你需要自定义或扩展Spring MVC的请求处理过程。

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值