在网上学习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