spring面试题_学习笔记

001.说说你对Spring的理解?

  • Spirng
    ① 生态:Spring是一个开源生态,你能想到的各种应用场景Spring生态中几乎都有对应的开源框架支持,所以有“Spring全家桶”的说法
    ② 框架: 痛殴长程序员嘴里的S热评一般指的是Spring Framework,他是一个轻量级的容器框架,主要是为了解决耦合问题,它的核心能力是容器(管理对象的声明周期)、IOC(控制反转)、AOP(面向切面编程)

002.说说Spring框架的优缺点?

  • 有点
    ① 核心能力: IOC(对象统一管理,降低对象耦合度)、AOP(不修改业务代码来对代码进行增强)、声明试失误(提升开发效率)
    ② 丰富的继承能力:如jdbc、各类中间件(redis、es、mongodb)封装、rest客服端、junit测试等实现快速继承,可以很简单的继承第三方框架
    ③ 源码非常优秀,扩展能力强,可以通过研究源码学习到各种设计模式和优雅代码的灵活运用
  • 缺点
    使用层面简单,但底层封装非常复杂,经过了十多年时间迭代,代码量比较庞大,Spring提供了很多扩展点,如果想深入学习源码的话比较困难。

003.说说IOC的作用和优点?

  • IOC(控制反转)
    ① 将创建对象的控制权交给Spring的IoC,即IoC控制了对象的创建权利。
    ② 如果要使用对象则使用DI(依赖注入)@Autowired注解自动注入即可。
  • 优点
    ① 集中管理对象,方便维护。
    ② 降低耦合度。

004.说说IoC的实现机制是什么?

  • 建单工厂模式
    通过BeanFactory的getBean(String className) 方法获取bean对象
  • 反射
    通过反射实例化bean对象。
  • 总结
    桶过建单工厂设计模式 + 反射实现IoC。

005.IoC和DI有啥区别?

  • IoC(控制反转)
    将对象控制权交由Spring,是解耦的一种设计思想,实现机制参考上一节。
  • DI(依赖注入)
    Spring统一管理对象后,通过依赖注入的方法将对象直接给到使用方,DI是IoC实现过程中的重要环节。

006.说说BeanFactory的作用?

① Spring核心顶层接口,它是一个容器,职责是产生Bean,管理Bean对象的声明周期。

② 实现了煎蛋工厂设计模式,通过getBean方法获取Bean对象。

③ 实现类比较多,每个实现类都有不同的职责(单一职责原则),最核心的是DefaultListableBeanFactory, Spring底层就是使用这个实现生产Bean。
在这里插入图片描述
007.说说BeanDefinition的作用?

① 存储Bean的定义信息机元数据,决定Bean的生产方式,例如OrderService是一个Bean,使用BeanDefinition定义塔的id、class、scope等。

② BeanDefinition通过内部的一个BeanDefinitionMap<beanName,BeanDefinition>存储Bean定义对象,然后将BeanDefinitionMap交给BeanFactory。

③BeanFactory通过BeanDefinition信息结合反射创建对象存放到 IoC容器中。

  • 总结
    a)BeanDefinition相当于启程模型,里面存放的是量产汽车的各项参数。
    b)BeanFactory通过BeanDefinition参数生产出实际的汽车。

008.BeanFactory和ApplicationContext的区别?

  • BeanFactory
    ① Spring容器顶层接口,通过getBean生产Bean、需要手动注册bean、内存占用小。
  • ApplicationContext/AnnotationConfigApplicationContext
    ① Spring上下文同时也是Spring容器,它实现了BeanFactory接口,所以具备getBean方法,但getBean只是一个门面方法,只是通过getBeanFactory().getBean去生成Bean。
    ② AnnotationConfigApplicationContext则是基于注解配置的实现,通过扫描注解注册bean。
    ③ 会自动注册bean、加载环境变量、支持多语言、实现事件监听、注册了很多扩展点。

009.BeanFactory和FactoryBean的区别?

  • BeanFactory
    ① Spring容器顶层接口,通过getBean生产Bean、需要手动注册bean、内存占用小。
  • FacrotyBean
    ① FacrotyBean是接口,必须被Bean实现,实现FacrotyBean接口的Bean是一个特殊的Bean,也是由BeanFactory管理。
    ② 原本通过getBean(“a”)获取到的a的Bean对象,如果实现了FactoryBean接口则getBean(“a”)返回的则是getObject() 返回的对象,假设在getObject()实现中return new B() 对象,这时候getBean(“a”) 实际返回的是B对象,要想返回a 对象则需要getBean(“&a”)。
    ③getObject() 相当于工厂方法,可以生产出任意对象,且具备懒加载特性,即使用到的Bean才调用getObject() 方法。

010.Spring IOC容器加载过程?

  • Bean初始化的几种状态
    ① 概念态:通过@Bean 或xml中 <bean>等配置bean的信息。
    ② 定义态:通过BeanDefinition封装Bean的定义信息,实际上是读取的bean的配置信息。
    ③ 纯静态:通过BeanDefinition中的bean信息反射new一个实例对象放入到二级缓存中,此时对象中的属性是没有值的。
    ④ 成熟态:通过依赖注入将纯净态的对象注入后的形成最终可在应用中使用的bean。

  • IOC 的加载过程(为 new AnnotationConfigApplicationContext() )

    ① 概念态通过调用invokeBeanFactoryPostProcessors将概念态注册为定义态。

    ② 调用BeanFactory的getBean生产bean(内部细节下次再说)。

011.SpringBean 和 JavaBean有啥区别?

  • SpringBean

由Spring IoC 容器管理、实例化的对象。

  • JavaBean

普通java类对象,由自己new出来的对象。

012.配置Bean有哪几种方式?

  • xml

通过 <bean class ="xxx.xxx.xxx" id = "xxx" > 配置。

  • 注解

通过在类上加@Component、@Controller、@Service、@Repostory注解,本质上是通过反射低啊用类的构造方式实例化对象。

  • JavaConfig

通过在方法上加@Bean的方式,通常会和类上的@Configuration注解结合一起使用,加@Bean的方法要求返回Bean对象,Bean对象可以在@Bean注解修饰的方法中自行创建。

  • @Import

Spring3.0 推迟的,有三种方式: ImportSelector 返回类路径数组、ImportBeanDefinitionRegistrar提供Bean注册器、导入其他的配置类。

013.Bean的作用域有哪几种?

  • 如何配置bean的作用域?

通过 <bean>标签的scope属性或者类上的@Scope注解配置。

  • 作用域有哪几种

① singleton (默认):单例,只创建一个bean对象。

② prototype:多例,每次getBean都获取一个新的bean对象。

③ request:必须是web应用,每个请求都会创建一个bean对象。

④ session: 必须是web应用,每个session会话都会创建一个bean对象。

⑤ application:全局应用范围内创建一个bean对象。

014.Spring为什么默认要使用单例bean?

  • 对象只会创建一次,每次回去的对象都是同一个。
  • 好处
    ① Spring每次通过反射或cglib生成bean实例、给bean分配内存都会消耗性能,单例bean则提高了服务器内存的利用率、减少了bean实例的生成频率。
    ② 减少了jvm垃圾回收频率,以为多例不断的创建bean实例会被不断的回收,但是单例bean可一直存在内存中,回收的对象变少了。
    ③ 提升bean获取性能够,以为除了第一个使用有bean创建过程会稍慢,后续直接从缓存中湖区快速返回。

015.Spring Bean 线程安全吗?

  • bean的作用域为单例

当bean的作用域为单例(默认) + 有状态时 则会出现线程安全问题

  • 怎样判断bean有状态?

bean本身有数据存储功能,就是有实例变量的bean对象,可以保存数据且数据可变,说人话就是bean对象有实例变量,并且可以读写这个实例变量。

  • 如何破局?

进行无状态话设计,不保存数据,bean中没有实例变量,或者实例变量不可变(常量),通过方法进行一次性读写。

016.Spring实例化bean有哪几种方式?

  • 构造器

配置 <bean>标签或者@Component注解,Spring则是将bean的class信息读取到BeanDefinition.beanClass属性,然后通过反射调用构造方法实例化对象。

  • 静态工厂方法

通过配置 <bean factory-method =“方法名” > 中facroty-method属性指定静态方法,在静态方法中实例化对象并返回。

  • 实例工厂(@Bean)

通过 <bean facroty-bean=" bean名称" facroty-method ="方法名"> facroty 指定工厂bean名称,facroty-method指定工厂bean实例方法,@Bean注解本质上也是实例工厂的方式。

  • FacrotyBean

在bean的基础上实现FactoryBean接口,通过getObjec() 方法返回实例化对象。

017.bean的状态方式有哪几种?

  • no

默认方式,不自动装配,通过手工ref属性装配。

  • byName

    通过bean的名称进行自动装配。

  • byType
    通过bean的类型进行自动装配。

  • constructor
    通过构造函数中参数的byType进行装配。

  • autodelect
    自动探测,如果有构造方法通过constructor方式,否则通过byType方式装配(Spring3.0后弃用)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值