吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 441|回复: 2
收起左侧

[求助] 关于springboot启动过程中BeanPostProcessor及其他初始化方法的问题

[复制链接]
ZMST123 发表于 2026-1-19 09:40
注:此贴有在别的网站发过,但没得到答案,所以想在此咨询一下各位。若有雷同不是抄袭。

在网上学习bean的生命周期时遇到了一些问题1.网上看到的
1.有说afterPropertiesSet方法和自定义init方法是夹杂在bean的前后置处理器是在之间执行的。

2.也有说自定义init方法和@PostConstruct是夹杂在bean的前后置处理器是在之间执行:


找了好多地方说法各不相同,但都是表明自定义init方法是夹杂在bean的前后置处理器是在之间执行的


2、实操先放结果

可以看到1.afterPropertiesSet方法是最先执行的2.前置处理器和后置处理器是一起执行的,中间没有其他的方法3.自定义init方法最后执行代码实际bean
[Java] 纯文本查看 复制代码
[url=home.php?mod=space&uid=376366]@service[/url]  
public class CustomService implements BeanNameAware {  
  
    public CustomService(){  
        System.out.println("===============调用了CustomService的构造方法=====================");  
    }  
  
    public void init(){  
        System.out.println("===============在bean内部实现,通过@Bean(initMethod=\"init\")指定的初始化方法======================");  
    }  
  
  
    public String achieve(String s1){  
        System.out.println("===============bean内实际业务代码,接收参数:"+s1+"======================");  
        return s1;  
    }  
  
    [url=home.php?mod=space&uid=1892347]@Override[/url]  
    public void setBeanName(String s) {  
        System.out.println("===============aware接口 setBeanName======================");  
    }  
}

afterPropertiesSet
[Java] 纯文本查看 复制代码
@Service  
public class CustomInitializeBean implements InitializingBean , ApplicationContextAware {  
  
  
    ApplicationContext applicationContext;  
    @Override  
    public void afterPropertiesSet() throws Exception {  
    //通过ApplicationContextAware applicationContext获取bean  
    // CustomBean bean = applicationContext.getBean(CustomBean.class);  
    //上述代码报错,此时还获取不到bean ? 
    System.out.println("======================================afterPropertiesSet===============================================");  
  
    }  
  
  
    @Override  
    public void setApplicationContext(ApplicationContext applicationContext) {  
        this.applicationContext = applicationContext;  
    }  
}

BeanPostProcessors
[Java] 纯文本查看 复制代码
@Service  
public class CustomApplyBeanPostProcessors implements BeanPostProcessor, PriorityOrdered {  
    @Override  
    public int getOrder() {  
        return 0;  
    }  
  
    @Override  
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
  
        if ("customService".equals(beanName)){  
            System.out.println("==========序号0的前置处理器:"+beanName+";;"+bean.toString());  
        }  
  
        // return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);  
        return bean;  
    }  
  
    @Override  
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
        if ("customService".equals(beanName)){  
            System.out.println("==========序号0的后置处理器:"+beanName+";;"+bean.toString());  
        }  
        // return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);  
        return bean;  
    }  
}

Configuration
[Java] 纯文本查看 复制代码
[/size][/font][/color][color=#444444][font=-apple-system, BlinkMacSystemFont, &quot][size=14px]@Configuration[/size][/font][/color]public class CustomBeanConfiguration {  
  
    @Bean(initMethod = "init")  
    public CustomService customBeanService2(){  
        return new CustomService();  
    }  
}


其他注解
[Java] 纯文本查看 复制代码
import org.springframework.stereotype.Service;  
  
import javax.annotation.PostConstruct;  
import javax.annotation.PreDestroy;  
  
@Service  
public class CustomOther {  
  
    @PostConstruct  
    public void init(){  
        System.out.println("================@PostConstruct 注解的处理方法=========");  
    }  
  
    @PreDestroy  
    public void destory(){  
        System.out.println("================@PreDestroy 注解的处理方法=========");  
    }  
}

问题
1.为什么我这个执行顺序不太对?为什么自定义的init方法是在最后执行?
个人感觉afterPropertiesSet应该就是在最前面执行的。毕竟直译就是是“参数设置之后”,前后置处理器是跟随每一个bean都要执行一遍,如果afterPropertiesSet夹在前后置处理器之间岂不是也要跟随每个bean都执行一遍?
2.执行了两遍构造方法,第二遍是在创建代理对象吗?如果是,为什么自定义的init方法会只跟随代理对象执行
把自己学迷糊了,求大佬们帮忙解答一下吧。T_T




发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ZMST123 发表于 2026-1-19 16:52
漏了几张图,分别对应1.1  1.2  和 2

1.1

1.1

1.2

1.2

2

2
sincek 发表于 2026-1-20 15:18
AbstractAutowireCapableBeanFactory#initializeBean
方法.png
applyBeanPostProcessorsBeforeInitialization 遍历中的InitDestroyAnnotationBeanPostProcessor为实现(initAnnotationType为注册注解)
invokeInitMethods 里面很明显了分别执行了这俩方法

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-2-20 15:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表