Spring 编程常见错误 50 例
傅健
Cisco 高级软件工程师、Netty 源码贡献者
17065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
结束语 (1讲)
期末测试 (1讲)
Spring 编程常见错误 50 例
15
15
1.0x
00:00/00:00
登录|注册

04|Spring Bean 生命周期常见错误

你好,我是傅健,这节课我们来聊一聊 Spring Bean 的初始化过程及销毁过程中的一些问题。
虽然说 Spring 容器上手简单,可以仅仅通过学习一些有限的注解,即可达到快速使用的目的。但在工程实践中,我们依然会从中发现一些常见的错误。尤其当你对 Spring 的生命周期还没有深入了解时,类初始化及销毁过程中潜在的约定就不会很清楚。
这会导致这样一些状况发生:有些错误,我们可以在 Spring 的异常提示下快速解决,但却不理解背后的原理;而另一些错误,并不容易在开发环境下被发现,从而在产线上造成较为严重的后果。
接下来我们就具体解析下这些常见案例及其背后的原理。

案例 1:构造器内抛空指针异常

先看个例子。在构建宿舍管理系统时,有 LightMgrService 来管理 LightService,从而控制宿舍灯的开启和关闭。我们希望在 LightMgrService 初始化时能够自动调用 LightService 的 check 方法来检查所有宿舍灯的电路是否正常,代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class LightMgrService {
@Autowired
private LightService lightService;
public LightMgrService() {
lightService.check();
}
}
我们在 LightMgrService 的默认构造器中调用了通过 @Autoware 注入的成员变量 LightService 的 check 方法:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Spring Bean的初始化和销毁过程中常见的错误及解决方案。通过两个案例详细介绍了在构造器内抛出空指针异常的问题,并对问题进行了深入分析,解释了Spring Bean初始化的关键步骤和装配行为发生的时机。文章还介绍了使用构造器参数进行隐式注入和在初始化方法中执行相应操作的解决方案,以及使用@PostConstruct注解和实现InitializingBean接口的方式来解决问题。此外,文章还指出了不同解决方案的适用场景,强调了Spring提供这些功能的灵活性和多样性。通过具体案例和源码分析,本文深入浅出地解决了Spring Bean生命周期中的常见问题,对于读者快速了解Spring Bean的初始化和销毁过程中的常见错误及解决方案具有很好的指导意义。文章内容涵盖了Spring Bean的生命周期、后置处理器等技术特点,对读者进行了全面而深入的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring 编程常见错误 50 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • NobugNomiss
    接口方法 close() 也会在 Spring 容器被销毁的时候自动执行么? 会,原因:requiresDestruction方法中,有两个逻辑短路或判断,第一个是destroyMethodName不为空,另一个是destroyMethodName为空且bean属于AutoCloseable类型,而Closeable接口是AutoCloseable的子类,所以可以满足条件执行close方法。
    2021-05-07
    1
    33
  • Geek_45e28f
    “LightService 的 shutdown() 方法能被自动调用;最终打印出 check all ligh” 调用的是LightService.check()吧?
    2021-09-10
    1
    5
  • Monday
    DefaultListableBeanFactory 类是 Spring Bean 的灵魂。dubug了看了DefaultListableBeanFactory#doCreateBean源码,也debug了下。bean的创建过程总结得不错
    2021-06-17
    2
  • 小飞同学
    思考题:会的。为啥@Bean要有销毁方法这个默认值?
    2021-04-28
    1
    2
  • kycool
    原文中: 我们在 LightMgrService 的默认构造器中调用了通过 @Autoware 注入的成员变量 LightService 的 check 方法: 中的 Autoware 应为 Autowired
    2021-12-09
    1
  • Swaven
    会的,在hasDestroyMethod方法中判断bean是否DisposableBean或者AutoCloseable实例,Close-able继承自AutoCloseable,所以会在销毁时执行。
    2021-06-02
    1
  • 小林桑
    简单总结一下吧: 1.无参构造方法内调用被注入对象的方法会报空指针异常 因为:Spring容器调用无参构造方法时,只是简单调用,并未对被注入的bean实例化,所以调用bean的方法会报空指针。如果使用有参构造方法,Spring会在执行构造方法时实例化bean,此时执行bean的方法就不会报错。 2.close、shutdown方法:使用@Bean注解的对象,Spring容器会在容器销毁时自动执行close和shutdown方法(close和shutdown必须是pulic且无参数的方法)。 3.如果想实现容器销毁时调用制定的方法还可以:@Bean(destroyMethod="methodName")指定销毁方法。或者使用其他注解注入(Component 或者 Service等),并且被注入的属性类型必须实现AutoCloseable接口的close方法。
    2024-01-13归属地:四川
  • 故作
    在第 02 课的案例 2 中,我们就提到了构造器参数的隐式注入。 纠正一下,是第01课的案例2
    2023-12-14归属地:河南
  • 傅老师你好,很羡慕你对源码的熟悉,你是如何做到的?我阅读调试了数次spring源码,还只是粗略了解,感觉很费力费神。
    2022-12-27归属地:安徽
  • 🇳 江⃮⃯⃗
    会被执行 if (bean instanceof DisposableBean || bean instanceof AutoCloseable) {return true;}
    2022-05-28
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部