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

简介: 面试官用这三个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三个问题的总结,希望有所帮助。

相关文章
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
3月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
4月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
118 0
|
1月前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
5月前
|
消息中间件 缓存 Java
Spring Boot最经典的20道面试题,你都会了吗?
Spring Boot最经典的20道面试题,你都会了吗?
175 0
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
2月前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
112 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
120 3