最后
经过日积月累, 以下是小编归纳整理的深入了解Java虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
这个地方就是对InstantiationAwareBeanPostProcessor
接口的应用,spring中很多地方都是这样的,这段逻辑看起来既像是装饰模式,又像是责任链模式。这样做的好处就是解耦了,将具体的业务逻辑与框架逻辑拆开,有利于扩展。下面这个图中列举了postProcessProperties的一些关键使用场景
所以我们经常看到的bean循环依赖的报错是从AutowiredAnnotationBeanPostProcessor
抛出的,就是因为AutowiredAnnotationBeanPostProcessor
是负责处理@Autowrited
注解依赖注入的。
=========================================================================
每天一个作死小技巧,在InstantiationAwareBeanPostProcessor
中有一个方法叫postProcessAfterInstantiation
,如果这个方法返回false,那么当前bean就不会进行依赖注入了
==========================================================================
当bean的属性全都有值了之后,就需要进行初始化操作了
其实initializeBean
的主体逻辑相当简单,我们先看源码:
-
调用
invokeAwareMethods
,invokeAwareMethods
中提供了对BeanNameAware
、BeanClassLoaderAware
、BeanFactoryAware
三种Aware
接口的优先支持 -
调用
applyBeanPostProcessorsBeforeInitialization
,这里是一个典型的BeanPostProcessor
的应用,在applyBeanPostProcessorsBeforeInitialization
中,for循环所有的beanPostProcessors,依次调用他们的postProcessBeforeInitialization
,这里也是代理+责任链的体现,也就是在这里提供了对@PostConstruct
注解的调用 -
调用
invokeInitMethods
,这里提供了对InitializingBean
接口以及init-method
方法的支持 -
调用
applyBeanPostProcessorsAfterInitialization
,这也是一个典型的BeanPostProcessor的接口应用,但是这次是循环调用postProcessAfterInitialization
接口,如果引入了aop的话,这里会是aop的入口
接下来我们验证一下:
这是Bean3,实现了BeanNameAware和InitializingBean接口
public class Bean3 implements BeanNameAware,InitializingBean {
private String beanName;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println(beanName+“:afterPropertiesSet”);
}
public void initMethod(){
System.out.println(beanName+“:initMethod”);
}
@PostConstruct
public void postConstruct(){
System.out.println(beanName+“:postConstruct”);
}
@Override
public void setBeanName(String name) {
this.beanName = name;
}
}
xml配置如下:
这是我的BeanPostProcessor
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals(“bean3”)) {
System.out.println(“now bean3 come in postProcessBeforeInitialization======”);
}
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals(“bean3”)) {
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
va面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**