关于Spring中几种常见接口执行顺序比较

执行顺序:

静态代码块 > 构造方法 > BeanFactoryAware > ApplicationContextAware > @PostConstruct > InitializingBean > InstantiationAwareBeanPostProcessor > BeanPostProcessor > ApplicationRunner

java 复制代码
/**
 * 执行顺序:
 * 静态代码块 > 构造方法 > BeanFactoryAware > ApplicationContextAware > @PostConstruct > InitializingBean > InstantiationAwareBeanPostProcessor > BeanPostProcessor > ApplicationRunner
 * */
@Component
public class BeanPostProcessorTest implements BeanPostProcessor, InitializingBean, BeanFactoryAware, ApplicationContextAware, InstantiationAwareBeanPostProcessor, ApplicationRunner {
    static Integer count = 1;
    public BeanPostProcessorTest(){
        System.out.println(count++ + "构造函数初始化...");
    }
    static {
        System.out.println(count++ + "静态代码块...");
    }

    @PostConstruct
    public void init(){
        System.out.println(count++ + "PostConstruct...");
    }
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println(count++ + "InstantiationAwareBeanPostProcessor-> postProcessBeforeInstantiation...");

        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        System.out.println(count++ + "InstantiationAwareBeanPostProcessor-> postProcessAfterInstantiation...");

        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 在 Bean 初始化之前添加逻辑
        System.out.println(count++ + "BeanPostProcessor-> postProcessBeforeInitialization...");
        return bean; // 返回原始或修改后的 Bean
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println(count++ + "BeanPostProcessor-> postProcessAfterInitialization...");

        // 在 Bean 初始化之后添加逻辑
        return bean; // 返回原始或修改后的 Bean
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println(count++ + "BeanFactoryAware-> setBeanFactory...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(count++ + "InitializingBean-> afterPropertiesSet...");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println(count++ + "ApplicationContext-> setApplicationContext...");

    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(count++ + "ApplicationRunner-> run...");
    }
}
相关推荐
人工智能训练1 小时前
UE5中如何解决角色网格体“掉下去”的问题
运维·服务器·windows·容器·ue5
Sumlll_8 小时前
Ubuntu系统下QEMU的安装与RISC-V的测试
linux·ubuntu·risc-v
猫头虎8 小时前
2025最新OpenEuler系统安装MySQL的详细教程
linux·服务器·数据库·sql·mysql·macos·openeuler
N***H4868 小时前
springcloud springboot nacos版本对应
spring boot·spring·spring cloud
木子.李3479 小时前
ssh连接远程服务器相关总结
运维·服务器·ssh
BD_Marathon10 小时前
SpringBoot——辅助功能之切换web服务器
服务器·前端·spring boot
晚风吹人醒.10 小时前
SSH远程管理及访问控制
linux·运维·ssh·scp·xshell·访问控制·远程管理
on the way 12311 小时前
day06-SpringDI 依赖注入
java·spring
C***115011 小时前
Spring aop 五种通知类型
java·前端·spring
Uncertainty!!11 小时前
Linux多用户情况下个别用户输入密码后黑屏
linux·远程连接