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后弃用)。