当前位置: 首页 > news >正文

专门做外国的网站有哪些国内软件公司排行榜

专门做外国的网站有哪些,国内软件公司排行榜,大型网站平台建设,网上电子商城系统文章目录 前言一、Lazy的解析1.1、场景一1.2、场景二 二、Lazy Bean的处理三、解决循环依赖的问题 前言 Lazy是Spring提供的注解,用于实现懒加载功能。该注解既可以修饰方法,也可以修饰类,字段等: 被Lazy修饰的类,不会…

文章目录

  • 前言
  • 一、@Lazy的解析
    • 1.1、场景一
    • 1.2、场景二
  • 二、@Lazy Bean的处理
  • 三、解决循环依赖的问题


前言

  @Lazy是Spring提供的注解,用于实现懒加载功能。该注解既可以修饰方法,也可以修饰类,字段等:

  • @Lazy修饰的类,不会在Spring容器的refresh方法中进行实例化,而是只有在第一次注入或使用该 Bean 时才会实例化。
@Lazy
@Component
public class MyService {// ...
}
  • @Lazy修饰的方法,该方法创建的 Bean 是懒加载的,只有第一次被注入或调用时才会初始化。
@Configuration
public class AppConfig {@Bean@Lazypublic ExpensiveBean expensiveBean() {return new ExpensiveBean();}
}
  • @Lazy修饰的字段,会延迟注入。
@Component
public class SomeComponent {@Autowired@Lazyprivate AnotherService anotherService;
}
  • @Lazy修饰的构造函数参数或方法参数,参数所代表的 Bean 会被延迟注入。
@Component
public class MyComponent {private final HeavyService heavyService;public MyComponent(@Lazy HeavyService heavyService) {this.heavyService = heavyService;}
}

一、@Lazy的解析

  @Lazy的解析时机,有两个场景:

场景处理逻辑
@ComponentScan 自动扫描组件ClassPathBeanDefinitionScannerprocessCommonDefinitionAnnotations() 中设置 lazyInit
手动注册配置类(如 registerBean(SomeClass.class)调用 processCommonDefinitionAnnotations() 设置 lazyInit

1.1、场景一

  对应的案例工程:

public class Demo1 {public static void main(String[] args) {// 初始化一个空容器AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 手动注册类 A,而不是使用 @ComponentScanAnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(context);reader.register(A.class);// 刷新容器,触发 Bean 生命周期context.refresh();System.out.println("IOC 容器已启动");// 懒加载:此时 A 还未被创建System.out.println("开始获取 A");A a = context.getBean(A.class);System.out.println("A 获取完成: " + a);}
}@Lazy
@Component
class A {public A() {System.out.println("A 被创建");}
}

  在AnnotationConfigUtils#processCommonDefinitionAnnotations时调用。
在这里插入图片描述

1.2、场景二

  对应的案例工程:

public class Demo2 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);System.out.println("IOC容器已启动");// 不会实例化 A,只有调用 getBean 时才会触发创建A a = context.getBean(A.class);System.out.println("B 已获取: " + a);}
}@Configuration
@ComponentScan
class Config {
}@Lazy
@Component
class B {public B() {System.out.println("B 初始化");}
}

  对应的解析时机是,refresh方法中,调用所有bean工厂的后置处理器,ConfigurationClassPostProcessor扫描并解析@ComponentScan注解的逻辑中:在这里插入图片描述
  parse最终会进入doScan方法:
在这里插入图片描述
  同样是在processCommonDefinitionAnnotations中设置bean定义的lazy属性:
在这里插入图片描述
  无论上述哪一个场景,最终的目的都是为了将bean定义的lazyInit属性进行设置,用于后续的判断。

二、@Lazy Bean的处理

  对于标注了@Lazy的Bean的处理,主要体现在两个地方:

  • 初始化所有非懒加载的单例bean
  • bean生命周期的属性注入

  在初始化所有非懒加载的单例bean时,如果发现某个bean定义的lazyInit属性为true,就不会对该bean进行实例化。
在这里插入图片描述
  而在bean生命周期的依赖注入阶段,当发现了某个注入点的bean定义的lazyInit属性为true:
在这里插入图片描述
  则会在buildLazyResolutionProxy内部直接生成一个代理对象并注入给对应的字段:
在这里插入图片描述
  生成代理对象。
在这里插入图片描述
  在实际调用时,执行TargetSource的回调,实际执行的也是DefaultListableBeanFactorydoResolveDependency方法。
在这里插入图片描述

三、解决循环依赖的问题

  使用@Lazy注解,也可以解决循环依赖的问题:

public class Demo3 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config1.class);}
}@Configuration
@ComponentScan
class Config1{}@Component
class C{@Lazy@Autowiredprivate D d;}@Component
class D{@Lazy@Autowiredprivate C c;}

  在上面的场景中,当C实例化完成,依赖注入D时,发现D是加上了@Lazy注解,就不会去Spring容器中去找D,走找不到创建的流程,而是直接生成一个D的代理对象,注入给C的D属性,然后C执行初始化操作,也就打破了循环依赖。
  当C中的D属性被调用时,才会回调切面的TargetSource,走DefaultListableBeanFactorydoResolveDependency方法,从Spring的容器中获取bean,获取不到就去创建,走doCreateBean的流程。(注意,同样无法解决两者都是构造方法的循环依赖问题,但是可以解决原型bean的循环依赖)

http://www.dtcms.com/a/495818.html

相关文章:

  • Git-git stash与分支管理
  • 企业管理软件系统网公司网站服务器优化
  • [嵌入式系统-136]:主流AIOT智能体软件技术栈
  • 半导体制造工艺基本认识 大纲
  • (三)TCP/IP
  • 机器学习(1) 监督学习和无监督学习
  • 问卷调查网站赚钱设计与网站建设案例
  • 杭州建设网站官网企业邮箱在哪里看
  • 如何选择做pc端网站备份wordpress数据库
  • CMake 编译中去掉警告/W3重写 cl: 命令行 warning D9025 :正在重写“/W3”(用“/w”)“
  • 工业上位机,用Python+Qt还是C#+WPF?​
  • 表白网站想学软件开发报什么专业
  • 网站未续费到期后打开会怎样好看的模板
  • TC3xx芯片】TC3xx芯片的SCU之WDT
  • 【OpenHarmony】医疗传感器模块架构
  • 「日拱一码」119 CP2K
  • 台阶仪在表面计量学的应用:基于表面纹理最大高度S±3σ的表征研究
  • 大型企业应该如何选择RPA?
  • 杭州哪里做网站好建设网站公司哪儿济南兴田德润有活动吗
  • 引流人脉推广软件莆田seo外包公司
  • SeC - 视频对象分割/AI抠像/视频绿幕抠像/视频一键换背景 支持50系显卡 一键整合包下载
  • 【ROS2】gdb、coredump 调试ROS2程序
  • h5页面生成青岛网站seo公司
  • PRNet:原始信息即全部所需
  • 【文档】部署 MySQL-Exporter
  • 南宁网站seo服务绛帐做网站
  • 10.17 枚举中间|图论
  • if条件语句 三目运算符 汇编分析
  • LeetCode 401 - 二进制手表
  • 【Leetcodenowcode数据结构】顺序表的应用