面试宝典-【spring】

时间:2024-03-15 21:45:42

目录

1.Spring是什么 ?

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

3.IOC容器是什么? 

4.什么是依赖注入? 

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对象的创建