面试宝典-【spring】

目录

[1.Spring是什么 ?](#1.Spring是什么 ?)

2.Spring框架中的单例bean是线程安全的吗?

3.IOC容器是什么?

4.什么是依赖注入?

[6.什么是AOP ?](#6.什么是AOP ?)

7.IOC容器初始化过程?

8.Bean的生命周期?

9.BeanFactory和FactoryBean的区别?

10.Bean注入容器有哪些方式?

11.Spring自动装配的方式有哪些?

12.AOP有哪些实现方式?

13.Spring通知有哪些类型?

14.Spring中的事务是如何实现的?

15.Spring中事务失效的场景有哪些?

16.Spring中的循环引用?


1.Spring是什么 ?

  • Spring是一款主流的Java EE轻量级开源框架
  • 用于简化Java企业级应用的开发难度和开发周期

2.Spring框架中的单例bean是线程安全的吗?

  • 不是线程安全的

  • 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多 个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中 有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步 问题。

  • Spring框架并没有对单例bean进行任何多线程的封装处理。

3.IOC容器是什么?

loC-->"控制反转",它不是一门技术,而是一种设计思想

Spring通过loC容器来管理所有Java对象的实例化和初始化,控制对象与对象之间的依赖关系

  • 将对象的创建权交出去,交给第三方容器负责
  • 将对象和对象之间的关系维护权交出去,交给第三方容器负

4.什么是依赖注入?

  • Spring创建对象的过程中,把对象依赖的属性注入到对象中。依赖注入主要有两种方式:构造器注入和set注入。

IOC就是一种思想,DI是对IOC的一种具体实现

6.什么是AOP ?

  • aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等

7.IOC容器初始化过程?

  • 1.从XML中读取配置文件。
  • 2.将bean标签解析成BeanDefinition,如解析property元素,并注入到BeanDefinition实例中。
  • 3.将BeanDefinition注册到容器BeanDefinitionMap中。
  • 4. BeanFactory 根据 BeanDefinition 的定义信息创建实例化和初始化 bean。

8.Bean的生命周期?

Spring容器在进行实例化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean

  • 1.bean对象的创建(调用无参构造)
  • 2.给bean对象设置相关属性
  • 3.bean后置处理器(初始化之前)
  • 4.bean对象初始化(调用指定的初始化方法)
  • 5.bean后置处理器(初始化之后)
  • 6.bean对象创建完成,可以使用了
  • 7.bean对象销毁(配置指定的销毁方法)
  • 8.IoC容器关闭

9.BeanFactory和FactoryBean的区别?

  • BeanFactory:这是 loC 容器的基本实现,是 Spring 内部使用的接口。面向 Sping 本身,不提供给开发人员使用。几乎所有场合都使用ApplicationContext而不是底层的 BeanFactory
  • FactoryBean配置一个FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是getObject()方法的返回值。

10.Bean注入容器有哪些方式?

  • 1.@Configuration用来声明一个配置类,然后使用 @Bean 注解,用于声明一个bean,将其加入到Spring容器中
  • 2.@ComponentScan放置在我们的配置类上,然后可以指定一个路径,进行扫描带有特定注解的bean,然后加至容器中

11.Spring自动装配的方式有哪些?

自动装配方式一: byType

  • byType:根据类型匹配IOC容器中的某个兼容类型的bean,为属性自动赋值
    • 若在IOC中,没有任何一个兼容类型的bean能够为属性赋值,则该属性不装配,即值为默认值null.
    • 若在IOC中,有多个兼容类型的bean能够为属性赋值,则抛出异常

自动装配方式二:byNam

  • byName:将自动装配的属性的属性名,作为bean的id在IOC容器中匹配相对应的bean进行赋值

bean标签里面的 id属性值必须和 自动装配的属性的属性名一致

12.AOP有哪些实现方式?

  • AOP有两种实现方式:静态代理和动态代理。

静态代理

  • 静态代理:代理类在编译阶段生成,在编译阶段将通知织入Java字节码中,也称编译时增强。AspectJ使用的是静态代理。
  • 缺点:代理对象需要与目标对象实现一样的接口,并且实现接口的方法,会有冗余代码。同时,一旦接口增加方法,目标对象与代理对象都要维护。

动态代理

  • 动态代理:代理类在程序运行时创建,AOP框架不会去修改字节码,而是在内存中临时生成一个代理对象,在运行期间对业务方法进行增强,不会生成新类

13.Spring通知有哪些类型?

  • 前置通知(Before):在目标方法被调用之前调用通知功能;
  • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
  • 返回通知(After-returning ):在目标方法成功执行之后调用通知;
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知;
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的逻辑。

14.Spring中的事务是如何实现的?

  • spring实现的事务本质就是aop完成,对方法前后进行拦截,在执行方法之前 开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

15.Spring中事务失效的场景有哪些?

  • ① 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出
  • ②抛出检查异常,配置rollbackFor属性为Exception
  • ③非public方法导致的事务失效,改为public

16.Spring中的循环引用?

循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A

循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖

  • ① 一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
  • ② 二级缓存:缓存早期的bean对象(生命周期还没走完)
  • ③三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

解决方案

  • 使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建
相关推荐
计算机学姐1 分钟前
基于微信小程序的网上订餐管理系统
java·vue.js·spring boot·mysql·微信小程序·小程序·intellij-idea
博一波2 分钟前
【设计模式-行为型】访问者模式
java·设计模式·访问者模式
计算机-秋大田16 分钟前
基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)
java·开发语言·后端·微信·小程序·课程设计
llp111021 分钟前
基于java线程池和EasyExcel实现数据异步导入
java·开发语言
醇氧29 分钟前
【mybatis】 插件 idea-mybatis-generator
java·intellij-idea·mybatis
Eiceblue1 小时前
Java 实现Excel转HTML、或HTML转Excel
java·html·excel·idea
明达技术5 小时前
分布式 IO 模块携手 PLC,开启设备车间降本增效新篇章
分布式
陈平安Java and C6 小时前
MyBatisPlus
java
秋野酱6 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇7 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试