springboot---成员初始化顺序

如果我们的类有如下成员变量:

@Component
public class A {@Autowiredpublic B b;  // B is a beanpublic static C c;  // C is also a beanpublic static int count;public float version;public A() {System.out.println("This is A constructor.");}@Autowiredpublic A(C c) {A.c = c;System.out.println("This is A constructor with c argument.");}@PostConstructpublic void init() {count = 5;System.out.println("This is A post construct.");}
}

下面的结论可以通过在构造函数里打断点Debug来观察。

首先初始化的是static成员变量, 此处的count采用默认值0。
然后初始化的是非static成员变量,此处的version采用默认值0.0。
然后Spring在实例化A时选择的构造函数的原则是:如果有构造函数被@Autowired所修饰,则采用该构造函数(注意,@Autowired(required = true)只能修饰一个构造函数),否则采用默认的无参构造函数。此处采用的构造函数为

@Autowired
public A(C c) {this.c = c;System.out.println("This is A constructor with c argument.");
}

注意执行完该构造函数后,此时的成员变量B并没有被注入,值还是null。

Spring容器选择合适的Bean注入b。
执行被@PostConstruct修饰的init()函数。

总之,在上面这个例子中,各成员变量的执行顺序为:“static 成员变量 ”–> “非static成员变量” --> “被@Autowired修饰的构造函数” --> “被@Autowired修饰的成员变量b” --> “被@PostConstruct修饰的init()函数”。
有时我们想要对静态成员进行依赖注入(通常是Field dependency injection,即直接在成员上加@Autowired,此种做法不推荐),直接在静态成员上加@Autowired是无效的(其值总为null),这是因为静态成员变量是类的属性,不属于任何对象,而Spring实现Field dependency injection 是要依靠基于实例的reflection(反射)进行的。在这个例子中,Spring通过反射生成bean a, 并且发现a使用了bean b(此时bean b已经生成并被注册到Spring容器中),再次利用反射生成setter方法并将b set进a,这样就实现了Field dependency injection。通过上述过程我们可以知道static成员由于不属于任何实例,所以无法实现这样的依赖注入,但是我们可以通过Constructor dependency injection(构造函数依赖注入)来实现。以上面的例子为例,Spring在生成bean a(调用A的构造函数)时,由于A的构造函数带有参数c,Spring将在容器里寻找是否有符合c类型的bean,找到后将bean c赋值给构造函数的参数c,然后当执行到A.c = c时成员变量c就被“注入”成功了。

如果我们希望某个Bean不要在Spring容器启动时初始化(这样可以加快应用的启动速度),而是在用到时才实例化,可以用@Lazy这个注解。将这个注解加在@Bean、@Component、@Service、@Configuration等注解上时,这些注解所修饰的Bean将在第一次引用时才实例化;如果在@Autowired上也同时加上这个注解,则该Bean将在第一次使用时实例化。我们再举个简单的例子:
在@Component等注解上加@Lazy

@Lazy
@Component
public class LazyBean {public LazyBean() {System.out.println("This is LazyBean constructor.");}
}

在UseBean里通过@Autowired注入LazyBean,不加@Lazy:

@Component
public class UseBean {@Autowiredprivate LazyBean lazyBean;public UseBean () {}
}

当应用启动时,Spring要去扫描这些被@Component等注解修饰的类,立即将他们实例化并注册到容器中,但是由于LazyBean 类被@Lazy修饰,Spring会跳过这个Bean的实例化。当生成UseBean后(即Spring完成对UseBean的构造函数的调用后),由于UseBean引用了LazyBean,这个时候Spring才将LazyBean实例化。因此,以上Bean的初始化顺序永远是先初始化UseBean,当执行到@Autowired private LazyBean lazyBean;时才实例化lazyBean。

在@Component等注解和@Autowired上都加@Lazy

@Getter@Componentpublic class UseBean {@Lazy@Autowiredprivate LazyBean lazyBean;public UseBean () {}@PostConstructpublic void init() {System.out.println(this.getLazyBean());}}

这种情况下即使执行到@Autowired private LazyBean lazyBean;时也没有真正实例化LazyBean ,只有在真正使用lazyBean时,即上述代码中的this.getLazyBean()时才开始调用LazyBean 的构造函数来实例化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[pytorch、学习] - 5.4 池化层

参考 5.4 池化层 在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。 5.4.1 二维最大池化层和平均池化层 池化层直接计算池化窗口内元素的最大值或者平均值。该运算也叫做最大池化层或平均池化层。 下面把池化层的前向计算实现在pool2d函数里…

mac上安装Chromedriver注意事宜

mac上安装Chromedriver注意事宜: 1.网上下载chromedriver文件或在百度网盘找chromedirver文件 2.将 chromedriver 放置到:/usr/local/bin/,操作如下: 打开Mac终端terminal : 进入 chromedirve文件所在目录,输入命令: s…

freemarker教程

FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1.文本:直接输出的部分 2.注释:<#-- … -->格式部分,不会输出 3.插值:即${…}或#{…}格式的部分,将使用数据模型中的部分替代输出 4.FTL指令:FreeMarker指定,和HTML标记类似,名字前…

[pytorch、学习] - 5.5 卷积神经网络(LeNet)

参考 5.5 卷积神经网络&#xff08;LeNet&#xff09; 卷积层尝试解决两个问题: 卷积层保留输入形状,使图像的像素在高和宽两个方向上的相关性均可能被有效识别;卷积层通过滑动窗口将同一卷积核和不同位置的输入重复计算,从而避免参数尺寸过大。 5.5.1 LeNet模型 LeNet分为…

Android内存管理机制

好文摘录 原作&#xff1a; https://www.cnblogs.com/nathan909/p/5372981.html 1、基于Linux内存管理 Android系统是基于Linux 2.6内核开发的开源操作系统&#xff0c;而linux系统的内存管理有其独特的动态存储管理机制。不过Android系统对Linux的内存管理机制进行了优化&…

【Ruby】Ruby 类案例

阅读目录 Ruby类案例保存并执行代码Ruby类案例 下面将创建一个名为 Customer 的 Ruby 类&#xff0c;声明两个方法&#xff1a; display_details&#xff1a;该方法用于显示客户的详细信息。total_no_of_customers&#xff1a;该方法用于显示在系统中创建的客户总数量。实例 #!…

[pytorch、学习] - 5.6 深度卷积神经网络(AlexNet)

参考 5.6 深度卷积神经网络&#xff08;AlexNet&#xff09; 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然20世纪…

Springboot---Model,ModelMap,ModelAndView

Model&#xff08;org.springframework.ui.Model&#xff09; Model是一个接口&#xff0c;包含addAttribute方法&#xff0c;其实现类是ExtendedModelMap。 ExtendedModelMap继承了ModelMap类&#xff0c;ModelMap类实现了Map接口。 public class ExtendedModelMap extends M…

东南亚支付——柬埔寨行

考察时间&#xff1a;2018.5.28 至 2018.6.6 为了解柬埔寨大概国情和市场&#xff0c;在柬埔寨开展了为期近10天的工作。 观察了交通情况&#xff0c;周边街道的店面与商品&#xff0c;摊贩等&#xff0c;也走访了大学校区&#xff0c;看了永旺商超、本地超市和中国超市&#x…

Puzzle (II) UVA - 519

题目链接&#xff1a; https://vjudge.net/problem/UVA-519 思路&#xff1a; 剪枝回溯 这个题巧妙的是他按照表格的位置开始搜索&#xff0c;也就是说表格是定的&#xff0c;他不断用已有的图片从(0,0)开始拼到(n-1,m-1) 剪枝的地方&#xff1a; 1.由于含F的面只能拼到边上&am…

[pytorch、学习] - 5.7 使用重复元素的网络(VGG)

参考 5.7 使用重复元素的网络&#xff08;VGG&#xff09; AlexNet在LeNet的基础上增加了3个卷积层。但AlexNet作者对它们的卷积窗口、输出通道数和构造顺序均做了大量的调整。虽然AlexNet指明了深度卷积神经网络可以取得出色的结果&#xff0c;但并没有提供简单的规则以指导…

springboot---mybits整合

配置 POM文件 <parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath /> </parent><properties><proj…

使用airdrop进行文件共享

使用airdrop进行文件共享 学习了&#xff1a; https://support.apple.com/zh-cn/HT203106 https://zh.wikihow.com/%E5%9C%A8Mac%E4%B8%8A%E7%94%A8%E8%BF%91%E6%9C%BA%E6%8D%B7%E4%BC%A0%EF%BC%88Airdrop%EF%BC%89%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 转载于:https://www.cn…

【链表】逆序打印链表

1 public class Main {2 3 // 逆序打印链表4 public void reversePrint(Node node) {5 if (node null){6 return;7 }8 reversePrint(node.next);9 System.out.println(node.data); 10 } 11 12 public Node crea…

[pytorch、学习] - 5.8 网络中的网络(NiN)

参考 5.8 网络中的网络&#xff08;NiN&#xff09; 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的模块充分抽取空间特征&#xff0c;再以由全连接层构成的模块来输出分类结果。其中&#xff0c;AlexNet和VGG对LeNet的改进主要在于如何…

springboot---集成mybits方法

SpringBoot集成mybatis配置 一个有趣的现象&#xff1a;传统企业大都喜欢使用hibernate,互联网行业通常使用mybatis&#xff1b;之所以出现这个问题感觉与对应的业务有关&#xff0c;比方说&#xff0c;互联网的业务更加的复杂&#xff0c;更加需要进行灵活性的处理&#xff0c…

jQuery源码解读

参考 &#xff1a; https://www.cnblogs.com/yuqingfamily/p/5785593.html 转载于:https://www.cnblogs.com/wfblog/p/9172622.html

info.plist文件里面添加描述 - 配置定位,相册等

<key>NSAppleMusicUsageDescription</key> <string>App需要您的同意,才能访问媒体资料库</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>App需要您的同意,才能访问蓝牙</string> <key>NSCalendar…

[pytorch、学习] - 5.9 含并行连结的网络(GoogLeNet)

参考 5.9 含并行连结的网络&#xff08;GoogLeNet&#xff09; 在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet的网络结构大放异彩。它虽然在名字上向LeNet致敬&#xff0c;但在网络结构上已经很难看到LeNet的影子。GoogLeNet吸收了NiN中网络串联网络的思…

mybits注解详解

一、mybatis 简单注解 关键注解词 &#xff1a; Insert &#xff1a; 插入sql , 和xml insert sql语法完全一样 Select &#xff1a; 查询sql, 和xml select sql语法完全一样 Update &#xff1a; 更新sql, 和xml update sql语法完全一样 Delete &#xff1a; 删除sql, 和xml d…