Bean通知
前面介绍了Bean的生命周期,那怎么获取到Bean在生命周期中的通知呢?
通知的监听:XXXAware接口。
前置、后置方法的通知:BeanPostProcessor接口。
初始化方法的通知:@PostConstruct注解。
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?