首页 > 其他分享 >初始化的代码块和@PostConstruct有什么区别

初始化的代码块和@PostConstruct有什么区别

时间:2024-09-26 21:22:10浏览次数:3  
标签:初始化 静态 代码 PostConstruct 实例 执行

背景

        在实际开发中,我们经常会需要进行一些初始化操作,比如进行一些预加载和赋值之类的。在代码中,常见的有通过静态代码块、非静态代码块,@PostConstruct来实现初始化。那么既然他们都可以实现初始化操作,那么他们有什么区别呢?

使用方式

  • 静态代码块:是用 static 关键字定义的一段代码块,用于初始化类的静态成员
  • 非静态代码块:是没有 static 关键字的代码块,用于初始化实例成员
  • @PostConstruct: 是一个用于标注方法的注解,该方法会在依赖注入完成后被自动调用

执行时机

  • 静态代码块:在类加载时执行,只会执行一次,适用于类级别的初始化
  • 非静态代码块:在每次创建类的实例时执行,即每次调用构造函数时都会执行,执行顺序在构造方法之前
  • @PostConstruct:当 Spring 容器初始化 bean 时,在所有的依赖注入完成后执行该方法。适用于 Spring 管理的 bean

作用范围

  • 静态代码块:只能访问静态变量和静态方法,不能直接访问实例变量和实例方法。因为它们在类加载时执行,而实例变量和方法需要在对象创建时才存在
  • 非静态代码块:可以访问实例变量和实例方法,也可以访问静态变量和静态方法。不能访问在构造函数中通过参数注入的依赖,因为非静态代码块在构造函数执行之前执行
  • @PostConstruct:可以访问实例变量和实例方法,也可以访问静态变量和静态方法。可以访问Bean的属性,因为它在依赖注入完成之后执行

应用场景

  • 静态代码块:只需要执行一次的初始化操作,通常用于设置静态变量的默认值、加载静态资源等。
  • 非静态代码块:适用于那些需要在每次实例化时执行的初始化操作,通常用于设置实例变量的默认值,或者执行一些实例级别的初始化逻辑。
  • @PostConstruct:通常用于执行一些需要依赖注入完成后的初始化逻辑,如初始化复杂对象、执行数据库连接等。

总结对比

特性静态代码块非静态代码块@PostConstruct 注解
定义位置类级别实例级别类中的方法
执行时机类加载时执行每次实例化时执行依赖注入后执行
调用次数只调用一次每次创建对象时调用每个 bean 创建时调用,单例只调用一次
访问权限只能访问静态成员可以访问实例和静态成员可以访问实例、静态成员和依赖注入的Bean
适用场景类级别初始化实例级别初始化Spring 容器管理的 bean 初始化

        静态代码块适用于类级别的静态初始化,非静态代码块适用于每个对象的初始化,而 @PostConstruct 则适合在 Spring 中进行依赖注入后的初始化。

标签:初始化,静态,代码,PostConstruct,实例,执行
From: https://blog.csdn.net/weixin_40709965/article/details/142577760

相关文章

  • 构建 JavaScript 代码:可读性和可维护性的最佳实践
    欢迎回到我们的javascript世界之旅!在这篇博文中,我们将深入探讨构建javascript代码的基本方面。正确的代码结构对于可读性、可维护性和协作至关重要。我们将介绍代码结构、语句、分号和注释。让我们开始吧!代码结构结构良好的javascript代码库易于阅读、理解和维护。以......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档回复:20240926<12019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带如果......
  • 优选拼团平台架构解析与关键代码逻辑概述
    一、系统架构设计优选拼团平台采用多层架构设计,主要包括前端展示层、业务逻辑层、数据访问层及数据存储层。前端展示层:负责用户界面的展示和交互,包括商品列表、拼团详情、订单管理等页面。前端采用现代前端框架(如Vue、React)构建,支持响应式布局,提供流畅的用户体验。业务逻辑层:处理平......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档公众号回复关键字:2024092612019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带......
  • Don't Block on Async Code 不要阻止异步代码
    翻译自 Don'tBlockonAsyncCode(stephencleary.com)ThisisaproblemthatisbroughtuprepeatedlyontheforumsandStackOverflow.Ithinkit’sthemost-askedquestionbyasyncnewcomersoncethey’velearnedthebasics.这是论坛和StackOverflow上反复......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方。
    704.二分查找总结:防止int溢出:classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){intmiddle=(left+right)/2;//intmid=(right-left)/......
  • 一考代码精简
    importjava.util.Scanner;importjava.util.ArrayList;importjava.util.List;classPlanInformation{privateintid;privateStringplanid;privateStringplanname;privateStringprocess;privateStringnextprocess;privateStringoperator;privateStrin......
  • 如何利用大模型提升前端研发效率和代码质量
     随着人工智能技术的飞速发展,尤其是大模型(LargeLanguageModels,LLM)的崛起,前端开发者迎来了全新的工作方式。大模型不仅可以提升研发效率,还能够显著提高代码质量。本文将深入探讨前端开发者如何利用大模型及其相关工具,提升工作效率和代码质量,并探讨未来可能的应用场景和发展方向......
  • 老牌经典音乐播放器Winamp终于开放源代码!但禁止修改和分叉
    9月25日消息,Winamp这个2000年代的经典音乐播放器,终于开放了其Windows端的源代码。Winamp的源代码托管在GitHub上,采用WinampCollaborativeLicense(WCL)Version1.0协议。根据该协议,开发者可改进功能并更新播放器UI,满足当前用户的需求,但不得基于该源代码进行分叉、修改或维护分叉......
  • jquery中判断图片是否存在的实现代码
    有时候我们需要判断当前的图片是否存在,方便后期做一些操作,当然也可以参考上一篇文章,如果不存在就替换位默认图片functionisHasImg(src){varimg=newImage();img.src=src;img.onload=function(){if(img.width>0||img.height>0){......