Spring入门——依赖注入的实现方式、如何阻止依赖注入和bean的初始化工作

initializeBean

其实initializeBean的主体逻辑相当简单,我们先看源码:

initializeBean主要逻辑

  1. 调用invokeAwareMethodsinvokeAwareMethods中提供了对BeanNameAwareBeanClassLoaderAwareBeanFactoryAware三种Aware接口的优先支持

  2. 调用applyBeanPostProcessorsBeforeInitialization,这里是一个典型的BeanPostProcessor的应用,在applyBeanPostProcessorsBeforeInitialization中,for循环所有的beanPostProcessors,依次调用他们的postProcessBeforeInitialization,这里也是代理+责任链的体现,也就是在这里提供了对@PostConstruct注解的调用

  3. 调用invokeInitMethods,这里提供了对InitializingBean接口以及init-method方法的支持

  4. 调用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”)) {

System.out.println(“now bean3 come in postProcessAfterInitialization======”);

}

return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);

}

}

最后我们看下打印的结果:

在这里插入图片描述

说明我们的理解是没有问题的,调用顺序如下:

调用顺序

最后的最后,关于Listener之前有一篇文章做了一点点的解析,我们知道,我们可以通过调用applicationContext.addApplicationListener的方法向容器中添加一个listener,但是,为什么我们在listener上添加一个@Component注解之后,这个listener也能生效呢?,原因就在这里:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

image

容对你有帮助,可以添加V获取:vip1024b (备注Java)**
[外链图片转存中…(img-coTuNU1V-1712113017870)]

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

[外链图片转存中…(img-GnKeNnyZ-1712113017870)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值