springboot通过钩子实现_Spring(七)核心容器 - 钩子接口

[toc]

前言

Spring 提供了非常多的扩展接口,官方将这些接口称之为钩子,这些钩子会在特定的时间被回调,以此来增强 Spring 功能,众多优秀的框架也是通过扩展这些接口,来实现自身特定的功能,如 SpringBoot、mybatis 等。

1、Aware 系列接口

Aware 从字面意思理解就是“知道”、“感知”的意思,是用来获取 Spring 内部对象的接口。Aware 自身是一个顶级接口,它有一系列子接口,在一个 Bean 中实现这些子接口并重写里面的 set 方法后,Spring 容器启动时,就会回调该 set 方法,而相应的对象会通过方法参数传递进去。我们以其中的 ApplicationContextAware 接口为例。

ApplicationContextAware

大部分 Aware 系列接口都有一个规律,它们以对象名称为前缀,获取的就是该对象,所以 ApplicationContextAware 获取的对象是 ApplicationContext 。

public interface ApplicationContextAware extends Aware {

void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

}

ApplicationContextAware 源码非常简单,其继承了 Aware 接口,并定义一个 set 方法,参数就是 ApplicationContext 对象,当然,其它系列的 Aware 接口也是类似的定义。其具体使用方式如下:

public class Test implements ApplicationContextAware {

private ApplicationContext applicationContext;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.applicationContext = applicationContext;

}

}

在 Spring 启动过程中,会回调 setApplicationContext 方法,并传入 ApplicationContext 对象,之后就可对该对象进行操作。其它系列的 Aware 接口也是如此使用。具体的调用时机会在后面详细介绍。

以下是几种常用的 Aware 接口:

BeanFactoryAware:获取 BeanFactory 对象,它是基础的容器接口。

BeanNameAware:获取 Bean 的名称。

EnvironmentAware:获取 Environment 对象,它表示整个的运行时环境,可以设置和获取配置属性。

ApplicationEventPublisherAware:获取 ApplicationEventPublisher 对象,它是用来发布事件的。

ResourceLoaderAware:获取 ResourceLoader 对象,它是获取资源的工具。

2、InitializingBean

InitializingBean 是一个可以在 Bean 的生命周期执行自定义操作的接口,凡是实现该接口的 Bean,在初始化阶段都可以执行自定义的操作。

public interface InitializingBean {

void afterPropertiesSet() throws Exception;

}

从 InitializingBean 源码中可以看出它有一个 afterPropertiesSet 方法,当一个 Bean 实现该接口时,在 Bean 的初始化阶段,会回调 afterPropertiesSet 方法,其初始化阶段具体指 Bean 设置完属性之后。

该接口使用方式如下:

@Component

public class Test implements InitializingBean {

@Override

public void afterPropertiesSet() throws Exception {

System.out.println("Test 执行初始化");

}

}

定义启动类:

@SpringBootApplication

public class Main {

public static void main(String[] args) {

SpringApplication.run(Main.class, args);

}

}

结果:

...

2020-02-24 08:43:41.435 INFO 26193 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpTraceFilter' to: [/*]

2020-02-24 08:43:41.435 INFO 26193 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webMvcMetricsFilter' to: [/*]

Test 执行初始化

2020-02-24 08:43:41.577 INFO 26193 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]

2020-02-24 08:43:41.756 INFO 26193 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@23529fee: startup date [Mon Feb 24 08:43:39 CST 2020]; root of context hierarchy

...

最终,afterPropertiesSet 方法被执行并打印输出语句。

3、BeanPostProcessor

BeanPostProcessor 和 InitializingBean 有点类似,也是可以在 Bean 的生命周期执行自定义操作,一般称之为 Bean 的后置处理器,不同的是,

BeanPostProcessor 可以在 Bean 初始化前、后执行自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用SpringBoot时,我们可以使用钩子函数来实现优雅的停止服务。钩子函数是在程序关闭之前执行的一段代码,可以用来完成一些必要的清理工作。有几种方法可以实现这个功能。 第一种方法是使用SpringBoot提供的Actuator功能。Actuator库提供了一系列的端点(endpoint),其中包括shutdown端点。默认情况下,shutdown端点是禁用的,我们需要在配置文件中打开它。首先,在pom.xml文件中引入Actuator的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` 然后,在配置文件中添加以下配置: ```yaml management: endpoints: web: exposure: include: shutdown ``` 现在,当我们访问"/actuator/shutdown"端点时,SpringBoot应用程序将优雅地停止。 另外一种方法是使用Java的Runtime类中的addShutdownHook()方法。通过在应用程序中注册一个钩子函数,我们可以在程序关闭前执行自定义的逻辑。例如,我们可以在钩子函数中停止依赖的服务、输出日志或发送信号给其他应用程序。以下是一个示例代码: ```java Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // 在这里执行停止服务的逻辑,比如停止依赖的服务、输出日志等 } }); ``` 当程序关闭时,钩子函数中的代码将被执行。 这些方法可以帮助我们实现SpringBoot应用程序的优雅停止。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Springboot 优雅停止服务的几种方法](https://blog.csdn.net/weixin_44421461/article/details/123587860)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值