博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring注解之@Lazy注解,源码分析和总结
阅读量:5052 次
发布时间:2019-06-12

本文共 2765 字,大约阅读时间需要 9 分钟。

关于延迟加载的问题,有次和大神讨论他会不会直接或间接影响其他类。spring的好处就是文档都在代码里,网上百度大多是无用功。

不如,直接看源码。所以把当时源码分析的思路丢上来一波。

 

二 源码分析

/** * Indicates whether a bean is to be lazily initialized. * 用于bean的延迟加载 * 

May be used on any class directly or indirectly annotated with {

@link * org.springframework.stereotype.Component @Component} or on methods annotated with * {
@link Bean @Bean}. * 可以用于直接或间接使用的@Component类,或者@Bean方法 *

If this annotation is not present on a {

@code @Component} or {
@code @Bean} definition, * eager initialization will occur. If present and set to {
@code true}, the {
@code @Bean} or * {
@code @Component} will not be initialized until referenced by another bean or explicitly * retrieved from the enclosing {
@link org.springframework.beans.factory.BeanFactory * BeanFactory}. If present and set to {
@code false}, the bean will be instantiated on * startup by bean factories that perform eager initialization of singletons. * 如果没有此注释则会直接加载。(也就是说启动的时候会按顺序注入spring容器)反之,则会在被另一个bean引用或显式引用前不会被初始化。 *

If Lazy is present on a {

@link Configuration @Configuration} class, this * indicates that all {
@code @Bean} methods within that {
@code @Configuration} * should be lazily initialized. If {
@code @Lazy} is present and false on a {
@code @Bean} * method within a {
@code @Lazy}-annotated {
@code @Configuration} class, this indicates * overriding the 'default lazy' behavior and that the bean should be eagerly initialized. * 如果@Configuration 上使用了Lazy,则@Configuration 中的所有都会被懒加载。若是没使用,则对项目中的方法进行正常加载,哪怕在其他地方写了Lazy。 * (因为spring默认注入顺序先执行@Configuration ,那么就算后面使用了Lazy实际上也已经在spring容器中了) *

In addition to its role for component initialization, this annotation may also be placed * on injection points marked with {

@link org.springframework.beans.factory.annotation.Autowired} * or {
@link javax.inject.Inject}: In that context, it leads to the creation of a * lazy-resolution proxy for all affected dependencies, as an alternative to using * {
@link org.springframework.beans.factory.ObjectFactory} or {
@link javax.inject.Provider}. * 除了作用于@Component组件或其@Bean初始化方法,也作用于Inject和Autowired。在这种情况下,它会导致创建一个所有受影响的依赖项的延迟解析代理,作为使用的替代方法 * (就是Autowired注释的bean会默认进行懒加载,除非他之前就被加载了,类似于@Configuration的情况)*/@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Lazy { /** * Whether lazy initialization should occur. */ boolean value() default true;//也就是不用标签是false,用就是true,网上什么@Lazy(true)大多是无谓代码}

三 总结

就是分两种情况作用于 配置和其相关方法等先加载的 ,作用于 Autowired等后加载的。

特点有两条

先加载的覆盖后加载的。直接的覆盖间接的。

第一条优先于第二条。

 

就是后加载的间接Bean若是在先加载的配置里被使用了,那么Lazy不起作用。

 

转载于:https://www.cnblogs.com/ydymz/p/9815560.html

你可能感兴趣的文章
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>
【安卓5】高级控件——拖动条SeekBar
查看>>