Sping面试题
创始人
2024-02-08 07:16:13
0

Spring相关

  1. BeanFactory和ApplicationContext有什么区别?
    • BeanFactoryApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。
      1. BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理。ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的功能扩展。
      2. BeanFactroy采用的是延迟加载形式来注入Bean的,只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能提前发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
      3. ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。
      4. ApplicationContext启动后预载入所有的单实例Bean,所以在运行的时候速度比较快,因为它们已经创建好了。相对于BeanFactory,ApplicationContext 唯一的不足是占用内存空间,当应用程序配置Bean较多时,程序启动较慢。
      5. BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。
  2. Spring Bean的生命周期?
    • 简单来说,Spring Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction
    • 但具体来说,Spring Bean的生命周期包含:
      1. 实例化Bean:
        • 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化
      2. 设置对象属性(依赖注入):
        • 实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入。
      3. **处理Aware接口:**Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的一些资源:
        • 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字;
        • 如果这个Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
        • 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
        • 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;
      4. **BeanPostProcessor前置处理:**如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。
      5. **InitializingBean:**如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
      6. **init-method:**如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
      7. **BeanPostProcessor后置处理:**如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
      8. **DisposableBean:**当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
      9. **destroy-method:**最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
  3. Spring中bean的作用域
    1. **singleton:**默认作用域,单例bean,每个容器中只有一个bean的实例。
    2. **prototype:**为每一个bean请求创建一个实例。
    3. **request:**为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
    4. **session:**与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。
    5. **global-session:**全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。
  4. Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?
    1. 对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。
    2. 对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。
      • **有状态Bean(Stateful Bean) :**就是有实例变量的对象,可以保存数据,是非线程安全的。
      • **无状态Bean(Stateless Bean):**就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。
    3. 对于有状态的bean,就需要自行保证线程安全
      • 将有状态的bean的作用域由“singleton”改为“prototype”。
      • 采用ThreadLocal解决线程安全问题,为每个线程提供一个独立的变量副本,不同线程只操作自己线程的副本变量。
  5. Spring 框架中都用到了哪些设计模式?
    1. 工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
    2. 单例模式:Bean默认为单例模式
    3. 策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
    4. 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
    5. 模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
    6. 适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
    7. 桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
  6. 什么是DI: IoC 的一个重点就是在程序运行时,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency Injection,依赖注入)来实现的,即**应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。**而 Spring 的 DI 具体就是通过反射实现注入的,反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性
  7. 什么是IOC
    1. IOC,Inversion of Control,控制反转,指将对象的控制权转移给Spring框架,由 Spring 来负责控制对象的生命周期(比如创建、销毁)和对象间的依赖关系。
    2. 对于某个具体的对象而言,以前是由自己控制它所引用对象的生命周期,而在IOC中,所有的对象都被 Spring 控制,控制对象生命周期的不再是引用它的对象,而是Spring容器,由 Spring 容器帮我们创建、查找及注入依赖对象,而引用对象只是被动的接受依赖对象,所以这叫控制反转。
  8. IoC的原理
    1. Spring 的 IoC 的实现原理就是工厂模式加反射机制
  9. Spring的自动装配
    1. 在Spring框架xml配置中共有5种自动装配:
      • no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
      • byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
      • byType:通过参数的数据类型进行自动装配。
      • constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
      • autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
    2. 基于注解的自动装配方式:
      • 使用@Autowired、@Resource注解来自动装配指定的bean。
      • 容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。
      • 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
      • 如果查询的结果不止一个,那么@Autowired会根据名称来查找;
      • 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
  10. @Component和@Bean的区别是什么
    1. 作用对象不同。@Component注解作用于类,而@Bean注解作用于方法。
    2. @Component注解通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中,@Bean注解通常是在标有该注解的方法中定义产生这个bean
    3. @Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...