• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
职业熬夜选手
博客园    首页    新随笔    联系   管理    订阅  订阅

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>

结果这里不做展示

posted @ 2023-03-07 10:09  职业熬夜选手  阅读(50)  评论(0)    收藏  举报  来源
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3