写点什么

三个 Spring 的问题把我问懵逼了

作者:知识浅谈
  • 2022 年 9 月 14 日
    吉林
  • 本文字数:1262 字

    阅读完需:约 4 分钟

三个Spring的问题把我问懵逼了

🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM 算法

💒 公众号:知识浅谈


🤞这次都给他拿下,下次和面试官 PK🤞


温馨提醒:这个面试官,太狠了

🎈spring 中创建 bean 的时候怎么调用构造函数?

spring 的创建过程查找使用构造函数的过程叫做推断构造方法。分以下几种情况:


  1. 没有实现构造函数类中会默认创建一个无参构造函数。

  2. 类中实现了无参构造函数创建 bean 的时候会调用自己定义的无参构造函数。

  3. 类中定义了无参构造和有参构造函数创建 Bean 的时候会调用无参构造函数

  4. 类中定义了一个有参构造函数如果没有定义无参构造函数的话,我们直到如果存在有参构造函数的话,就不会自动创建无参构造函数了,那 spring 中也就找不到无参构造就会调用有参构造函数了(当然这是在只有一个有参构造函数的前提下)。

  5. 类中定义了多个有参构造函数会报错,因为 spring 在没有无参构造函数的情况下,也不知道该调用哪个,也可以在想要用的构造方法上加 @Autowire,针对有参的构造函数,参数我们可以去容器中根据类型查找,如果根据类型查找有多个,再根据名称查找,根据名称找不到报错,如果不存在的话就创建,创建的时候有可能出现循环依赖的问题,然后又引入了 spring 的三级缓存解决循环依赖。

🎈spring 中创建 bean 为什么要用三级缓存而不是两级缓存?

首先为什么要有缓存,因为不用缓存,存在循环依赖的时候没办法解决循环依赖的问题。既然看到这个问题说明对 bean 创建的过程中三级缓存的作用有一定的了解了。

🐎为什么不用两级缓存?因为如果生成的 Bean,都不需要生成代理对象的话,可以只是用两级缓存,但是如果需要生成代理对象的话就需要三级换缓存了,因为如果假如我们没有第二层的缓存,创建的对象方法了第三级缓存中,其他 bean 创建的时候注入当前 bean,因为检测到当前 bean 有 AOP 就会让当前 bean 生成代理对象,但是如果有多个其他 bean 要注入当前 bean 都会生成当前 bean 的代理对象,所以也就需要第二级缓存来存放生成的当前在第三级存储的 bean 的代理对象,在其他 bean 需要注入当前 bean 的时候直接去第二级缓存中取出来即可。

🎈Spring 中的 @Lazy 注解的含义?

这个注解在不同的位置所表达的含义也不一样,以下分不同情况讨论。


  1. @Lazy 在类上修饰表示启动的时候不会创建对象,在真正使用的时候才会创建对象。


  @Lazy  class A {      public static void main(String[] args)  {      }  }
复制代码


  1. @Lazy 修饰在 @Bean 注解的方法上,在启动的时候不会创建 bean 对象,当使用的时候才会创建 @Bean 修饰的方法返回的对象。


  @Configuration  class A {            @Bean      @Lazy      public B get(){          return new B();      }  }  class B{  }
复制代码


  1. @Lazy 放在 @Autowired 注解的属性上, 不是在修饰的属性上赋真正的值,只是会赋值一个代理对象,当真正使用到这个属性的时候,才回去容器中找到一个符合的对象。


  @Component  class A {        @Autowired      @Lazy      private B b;  }    @Component  class B{  }
复制代码

🍚总结

以上为对于 Spring 三个问题的总结,希望有所帮助。

发布于: 刚刚阅读数: 3
用户头像

知识浅谈

关注

公众号:知识浅谈 2022.06.22 加入

🍁 作者:知识浅谈,InfoQ签约作者,CSDN博客专家/签约讲师,华为云云享专家,阿里云签约博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥 联系方式vx:zsqtcc

评论

发布
暂无评论
三个Spring的问题把我问懵逼了_spring_知识浅谈_InfoQ写作社区