面试官用这三个Spring的问题把我问懵逼了

举报
知识浅谈 发表于 2022/09/14 13:11:13 2022/09/14
【摘要】 面试官用这三个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)  {
        }
    }
    
  2. @Lazy修饰在@Bean注解的方法上,在启动的时候不会创建bean对象,当使用的时候才会创建@Bean修饰的方法返回的对象。
    @Configuration
    class A {
        
        @Bean
        @Lazy
        public B get(){
            return new B();
        }
    }
    class B{
    }
    
  3. @Lazy 放在@Autowired注解的属性上, 不是在修饰的属性上赋真正的值,只是会赋值一个代理对象,当真正使用到这个属性的时候,才回去容器中找到一个符合的对象。
    @Component
    class A {
    
        @Autowired
        @Lazy
        private B b;
    }
    
    @Component
    class B{
    }
    

🍚总结

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。