Bean通知

前面介绍了Bean的生命周期,那怎么获取到Bean在生命周期中的通知呢?

  1. 通知的监听:XXXAware接口。

  2. 前置、后置方法的通知:BeanPostProcessor接口。

  3. 初始化方法的通知:@PostConstruct注解。

  4. Bean销毁通知:@PreDestroy注解。

Awaare介绍

Spring源码中接口以Aware结尾的接口(XXXAware)在Spring中表示对XXX可以感知,通俗点解释就是:如果在某个类里面想要使用spring的一些东西,就可以通过实现XXXAware接口告诉Spring,Spring看到后就会给你送过来,而接收的方式是通过实现接口唯一方法set-XXX.比如:有一个类想要使用当前的ApplicationContext,那么我们只需要让它实现ApplicationContextAware接口,然后实现接口中的唯一方法。

Spring Aware的目的是让Bean获得Spring的容器服务, 对于应用程序来说,应该尽量减少对Sping Api的耦合程度。

分类

通知接口
作用

BeanNameAware

在Bean中获取到它在IOC容器里面的名字。

BeanFactoryAware

在Bean中获取到它所在的IOC容器,从而在Bean中直接使用IOC容器的服务。

ApplicatonContextAware

在Bean中获取到它所在的应用上下文,从而可以在Bean中直接使用上下文服务。

应用

package com.skuu.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @author dcx
 * @since 2025-05-21 10:31
 **/
@Component
public class BeanAware implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, ResourceLoaderAware {

    private BeanFactory beanFactory;
    private ApplicationContext applicationContext;
    private ResourceLoader resourceLoader;

    @Override
    public void setBeanName(String s) {
        System.out.println("收到通知:" + s);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("收到通知:beanFactory");
        this.beanFactory = beanFactory;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("收到通知:applicationContext");
        this.applicationContext = applicationContext;
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        System.out.println("收到通知:resourceLoader");
        this.resourceLoader = resourceLoader;
    }

    /**
     * bean初始化
     * @param
     * @return void
     * @author dcx
     * @date 2025/5/21 11:10
     **/
    @PostConstruct
    public void postConstruct() {
        System.out.println("执行bean的初始化方法:BeanAware");
    }

    public void use() {
        System.out.println("使用 Bean:BeanAware");
    }

    /**
     * bean销毁
     * @param
     * @return void
     * @author dcx
     * @date 2025/5/21 11:10
     **/
    @PreDestroy
    public void preDestroy() {
        System.out.println("bean被销毁:BeanAware");
    }

}

运行

@SpringBootTest
class BeanAwareTest {

    @Autowired
    private BeanAware beanAware;

    @Test
    void use() {
        beanAware.use();
    }
}

结果

Last updated

Was this helpful?