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

在网上学习bean的生命周期时遇到了一些问题

1.网上看到的

1.有说afterPropertiesSet方法和自定义init方法是夹杂在bean的前后置处理器是在之间执行的。

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

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

2、实操

先放结果

可以看到

1.afterPropertiesSet方法是最先执行的

2.前置处理器和后置处理器是一起执行的,中间没有其他的方法

3.自定义init方法最后执行

代码

实际bean

java 复制代码
package com.example.myspringboot.cunstom;  
  
import org.springframework.beans.factory.Aware;  
import org.springframework.beans.factory.BeanNameAware;  
import org.springframework.stereotype.Service;  
  
@Service  
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;  
    }  
  
    @Override  
    public void setBeanName(String s) {  
        System.out.println("===============aware接口 setBeanName======================");  
    }  
}

afterPropertiesSet

java 复制代码
package com.example.myspringboot.config;  
  
import org.springframework.beans.factory.InitializingBean;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.ApplicationContextAware;  
import org.springframework.stereotype.Service;  
  
@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 复制代码
package com.example.myspringboot.config;  
  
import org.springframework.beans.BeansException;  
import org.springframework.beans.factory.config.BeanPostProcessor;  
import org.springframework.core.PriorityOrdered;  
import org.springframework.stereotype.Service;  
  
@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 复制代码
package com.example.myspringboot.config;  
  
import com.example.myspringboot.cunstom.CustomService;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
@Configuration  
public class CustomBeanConfiguration {  
  
    @Bean(initMethod = "init")  
    public CustomService customBeanService2(){  
        return new CustomService();  
    }  
}

其他注解

java 复制代码
package com.example.myspringboot.config;  
  
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

相关推荐
边境悍匪几秒前
蜗牛学苑 Java 智能体学习 Day36|阿里云 OSS 文件上传、Spring 事务、全局异常思维导图复盘
java·学习·阿里云
苏渡苇1 分钟前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
java·后端·spring·spring cloud·springboot·性能监控
裕晟资质规划5 分钟前
军工保密资质二级申报的四个可量化硬条件:条文位置、数值口径与西安配套企业实务要点
java·服务器·网络·数据库·算法
初願致夕霞7 分钟前
C/C++传统程序内存分布(代码实测)
java·c语言·c++
掉鱼的猫7 分钟前
不只是 Token 流:Solon AI 4.1 的语义化聊天事件
java·openai
她的男孩18 分钟前
同一个接口,为什么销售只看到自己的订单?我拆了 681 行数据权限拦截器的源码
java·后端·架构
卓怡学长25 分钟前
w157基于springboot北部湾地区助农平台
java·spring boot·spring·maven·intellij-idea
小白羊丨26 分钟前
问数 Agent 整体架构、意图识别、历史上下文与 NL2SQL
java·面试·架构
Linux-lucky35 分钟前
33-Linux学习之旅之MySQL用户管理
java·linux·运维·学习·mysql·ubuntu
SimonKing40 分钟前
将cURL 命令直接变成 Java 代码?用JQuick-Curl搞起来
java·后端·程序员