Spring面经

1、Spring的优缺点?用到了那些设计模式?

答:
1、spring属于低侵入式设计,代码的污染读极低
2、spring的DI(依赖注入)机制将对象之间的依赖关系交由框架处理
	减低组件的耦合性
3、spring提供了aop技术,支持一字儿通用任务,如安全。事务、
	日志、权限等进行集中式管理,从而提供更好的复用
4、spring对于主流的应用框架提供了集成支持
用到了单例模式、工厂模式、代理模式、模板方法模式、观察者模式

2、如何而理解spring中的IOC

答:IOC就是控制反转,是指将创建对象的控制权移交给spring容器,
底层是用了反射+工厂模式创建的,IOC让对象的创建不再new,
对象和对象之间松散耦合。

3、IOC的注入有哪几种?

答:IOC的注入有三种:1、set注入 2、构造器注入 3、根据注解注入
注意,set注入时。若某个成员必须有值,则获取对象时有可能set方法没有执行,
例如在构造函数中调用对象方法时,此时还没有注入bean对象

4、spring aop的理解

答:aop,又被面向切面,它是作为面向对象的一种补充,
用于将那些与业务无关,但却与多个对象产生公共影响的行为逻辑,
抽取并封装成一个可重用模块。AOP 减少了系统中的重复代码,
降低了模块间的耦合度,同时提高了系统的可维护性。
可用于权限认证、日志、事务处理。
aop的底层实现是代理模式,分为动态代理、静态代理,
aop中包括前置通知、后置通知、返回通知、异常通知以及环绕通知
同时注意springAop的通知顺序可能会乱序,若对顺序性有要求的请使用环绕通知

5、介绍下beanfactory和ApplicationContext,他们有什么区别?

答:BeanFactory 和ApplicationContext是IOC核心容器的两个接口,
不过,ApplicationContext创建容器,容器创建对象采取的策略时立即加载的方式,
也就是说只要读完配置文件,马上创建配置文件中的配置的对象(适用于单例对象)
Applicationcontext 有三个实现类:
1、ClassPathXmlApplicationContext,它可以加载类路径下的配置文件,
要求配置文件必须在类路径下,不在的话,加载不了
2、FileSystemXmlApplicationContext,它可以加载磁盘任意路径下的配置文件
3、读取注解创建容器
BeanFactory:在创建核心容器时,创建的对象采取的策略是延迟加载的方式,
也就是说,什么时候用到对象什么时候在创建对象
区别:两者创建的容器创建对象的时间不同,建议资源匮乏的环境中使用BeanFactory
(题外话:学spring到如今整理有疑惑,采用BeanFactory创建核心容器会不会与单例有冲突,
如果没有是怎样处理的,个人见解,当时思考这问题时,受到了局限性,认为bean的作用范围就单例和多例,
但是还有session等,像这些并美哦与规定什么时候创建,应该是依靠容器的属性创建)

6、创建Bean对象的方式有哪些?

答:
1、使用默认构造函数创建
2、使用普通工厂方法创建(类似@bean注解那样的形式)
3、使用工厂中的静态方法创建

7、bean对象的生命周期

答:
1、实例化
2、属性赋值
3、初始化
4、销毁

8、bean的作用域有哪些

答:
1、singleton:默认,每个容器中只有一个 bean 的实例,
单例的模式由 BeanFactory 自身来维护
2、prototype:为每一个 bean 请求提供一个实例
3、request:为每一个网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收
4、session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,
bean 会随之失效
5、global-session:全局作用域

9、Spring中的单例bean是线安全的吗?

答:如果Bean没有可变的状态,那他是线程安全的,若有可变状态,则需要自行保证线程安全,课根据有无状态来判断:
		1、无状态:没有实例变量的对象,不保存数据,是不变类,如:service
		2、有状态:有实例变量的对象,保存数据,是非线程安全的

10、对于无状态的bean如何保证线程安全

答:
1、更改为多例模式
2、也可以使用ThreadLocal来解决线程安全问题,为每一各变量提供一个独立的副本变量
注:ThreadLocal和线程同步机制都能解决多想成的访问冲突问题,
不同的是同步机制采用的是“时间换空间”的方式,ThreadLocal采用的是“空间换时间”的方式

11、@Autowired和@Resource之间的区别

答:
1、@Autowired默认是按照类型注入的,默认请况下要求依赖对象必须存在
只有找不到bean才会按照名称注入
2、@Resource 默认是按照名字来装配注入的,只有找不到名称匹配不到的
bean才会按照类型注入

12、spring容器的启动流程

答:
1、初始化spring容器:
	1)、实例化BeanFactory工厂,用于生成bean对象
    2)、实例化BeanDefinitionReader注解配置读取器,
    用于对特定注解(如@Service、@Repository)的类进行读取并装换成BeanDefinition对象,
    该对象存储了bean对象的所有特征信息,如:是否单例、是否懒加载等
    3)、实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定包目录进行路径扫描查找bean对象
2、将配置类的BeanDefinition注册到容器中,即通过配置读取器读取bean对象的所有特征信息生成BeanDefinition对象
,注册到BeanDefinitionRegister中。
3、调用refresh方法刷新容器,刷新容器会实例化所有单例方法。
	1)、prepareRefresh()刷新前预处理
	2)、obtainFreshBeanFactory()获取在容器初始化时创建的BeanFactory
	3)、prepareBeanFactory(beanFactory):beanfactory的预处理工作,向容器中添加一些组件。
	4)、postProcessBeanFactory,子类若重写该方法可以实现BeanFactory创建以及预处理之后的事情
	5)、invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory标准初始化之后执行
	BeanFactoryPostProcessor的方法,即BeanFactory的后置处理器。
	6)、registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,
	它的主要作用是干预Spring初始化bean的流程,从而完成代理、自动注入、循环依赖等功能
	7)、initMessageSource():初始化MessageSource组件,主要用于做国际化功能,消息绑定与消息解析:
	8)、 initApplicationEventMulticaster():初始化事件派发器,在注册监听器时会用到:
	9)、 onRefresh():留给子容器、子类重写这个方法,在容器刷新的时候可以自定义逻辑
	10)、 registerListeners():注册监听器:将容器中所有的ApplicationListener注册到事件派发器中,
	并派发之前步骤产生的事件:
	11)、 finishBeanFactoryInitialization(beanFactory):初始化所有剩下的单实例bean,核心方法是preInstantiateSingletons(),会调用getBean()方法创建对象;
	12)、 finishRefresh():发布BeanFactory容器刷新完成事件:

13、spring的循环依赖解决

答:三级缓存:
	1、singletonObjects(一级缓存)
	2、earlySingletonObjects(二级缓存)
	3、singletonFactories(三级缓存)
首先,spring允许在没初始化时提前暴露bean对象,流程:首先实例化A对象,存放在singletonFactories中,
然后初始化A对象,发现A对象依赖B对象,首先在singletonObjects中寻找,
没有找到(在这个步骤还有个判断对象是否正在创建,若是正在创建,基本是循环依赖),
在earlySingletonObjects中找如果没有找到,在三级中找,没有就实例化一个B对象,
存放在singletonFactories中,同理在在注入B对象A依赖的过程中,从singletonFactories中发现有A对象,
就把气提升到earlySingletonObjects中,删除singletonFactories中的A对象,
由于B对象初始化成功,将B对象存放到singletonObjects中,其余的缓存中删除该对象,
由于B对象创建完成,返回注入到A对象中,将A对象保存在singletonObjects中,删除二级缓存中的对象

14、spring的常见注解

答:
1、@component、@Service、@controller、@Repository,
后三个注解,都是一样的,都继承与@Component
2、@Autowired、@Qualifier、@Resource、@Value
3、@Scope、
4、@Configuration、@ComponentScans、@Bean、@import、@PropertySource

待续…

上一篇:【spring】BeanFactory与FactoryBean的区别


下一篇:Spring扩展——BeanFactory和FactoryBean