SpringBean生命周期中BeanPostProcessor使用实例
实例介绍
给SpringIOC对象的status属性赋值(有很多种方式不做介绍,这里只做BeanPostProcessor用法案例)
定义我们要装配SpringBean的注解
/**
* @Description 装配Spring静态属性值
* @Author zkq
**/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface StatusFieldAssign {
// 这里可以扩展其他属性值,这里不做介绍
}
BeanPostProcessor接口内容介绍
public interface BeanPostProcessor {
/**
* SpringBean的前置处理
*/
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
/**
* SpringBean的后置处理
*/
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
实现BeanPostProcessor并把当前类注入SpringIOC
/**
* @Description 给SpringBean的静态属性赋值
* @Author zkq
**/
@Component
public class SingletonStatusFieldAssignBeanPostProcessor implements BeanPostProcessor {
private ConfigurableApplicationContext configurableApplicationContext;
// 有参构造,SpringIOC实例时会帮我们出入Spring上下文环境
public SingletonStatusFieldAssignBeanPostProcessor(ConfigurableApplicationContext configurableApplicationContext){
this.configurableApplicationContext = configurableApplicationContext;
}
/**
*
* @param bean 当前SpringBean
* @param beanName 当前SpringBean name
* @return 返回的SpringBean 对象
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 当前代码没有做非空判断和容错
Field[] declaredFields = bean.getClass().getDeclaredFields();
for (Field field: declaredFields) {
// 检擦所有属性是否有StatusFieldAssign注解
StatusFieldAssign annotation = field.getAnnotation(StatusFieldAssign.class);
if(annotation != null){
fieldAssign(bean, field);
}
}
return bean;
}
// 给属性赋值
private void fieldAssign(Object bean,Field field){
Class<?> type = field.getType();
Object fieldBean = configurableApplicationContext.getBean(type);
field.setAccessible(true);
try {
field.set(bean, fieldBean);
} catch (IllegalAccessException e) {
e.printStackTrace();
}finally {
field.setAccessible(false);
}
}
}
定义个SpringBean和静态属性测试类
/**
* @Description 测试类SpringBean静态属性赋值
* @Author zkq
**/
@Component
public class AAA{
@StatusFieldAssign
private static BBB bbb;
public static BBB getBbb(){
return bbb;
}
}
测试类
@SpringBootTest
public class ApplicationTests {
@Test
void contextLoads() {
// 这里不需要注入可直接使用 因为是static方法
System.out.println(AAA.getBbb());
}
}
测试所需maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
结果这里不做展示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器