spring是什么
是一个容器框架,用来装JavaBean(Java对象),中间层框架,起连接作用,
是一个轻量级控制反转(IOC)和切面(AOP)的容器框架
对AOP的理解
AOP:将程序中的各种交叉业务逻辑(比如安全,日志,事务等)封装成一个切面,然后注入到目标对象(具体业务逻辑)中去,AOP可以对某一个对象或者某些对象的功能进行增强,比如对象中的方法进行增强,可以在执行某个方法之前额外的做一些事情,在某个方法执行之后额外的做一些事情
谈谈你对IOC的理解
容器概念:IOC容器实际上就是个map(key,value),里面存储的是各种对象(在xml里面配置的bean节点,@repository,@service,@controller,@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建放到对象map,扫描到打上上述注解的类还是通过反射创建对象放到map里
控制反转:对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来,就是控制反转这个名词由来, 把全部对象的控制权上缴给第三方IOC容器,所以IOC就成为 整个系统的关键核心,起到一种类似粘合剂的作用,把系统中的所有对象粘和在一起
依赖注入:获得依赖对象的过程被反转了,控制被反转之后,获得依赖对象的过程由自身管理变成了由IOC容器主动注入,依赖注入是实现IOC的方法,由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中
BeanFactory和ApplicationContext有什么区别
ApplicationContext是BeanFactory的子接口
BeanFactroy采用的是延迟加载形式注入Bean,即只有在使用某个Bean时(调用getBean()),才对该Bean进行加载实例化,就不能发现一些存在的spring的配置问题
ApplicationContext,是在容器启动时,一次性创建所有的Bean,在容器启动时,就可以发现spring中存在的配置错误
相对于基本的Bean Factory,applicationContext唯一的不足是占用内存空间,配置Bean较多时,启动较慢
BeanFactory通常以编程方式被创建,ApplicationContext还能以声明的方式创建,如使用Context Loader
BeanFactory和ApplicationContext都支持BeanPostProcrssor,BeanFactoryPostProcessor的使用,但二者之间的区别是BeanFactory需要手动注册,而ApplicationContext则是自动注册
描述一些Spring Bean的生命周期
1,解析类得到BeanDefinition
2,如果有多个构造方法,则推断构造方法
3,确定构造方法后,进行实例化得到对象
4,对对象中添加@Autowired注解的属性进行属性填充
5,回调Aware方法,(比如BeanNameAware,BeanFactoryAware)
6,调用BeanPostProcessor的初始化前的方法
7,调用初始化方法
8,调用BeanPostProcessor的初始化后的方法,进行AOP
9,如果当前创建的bean是单例就把bean放入单例池
10,使用bean
11,spring容器关闭时调用DisposableBean中的Destroy()方法
解释Spring支持的几种bean的作用域
singleton:默认,每个容器中只有一个bean的实力,单例的模式由beanFactory本身来维护,该对象的生命周期是和spring IOC容器一致的(第一次被注入时创建)
prototype:为每一个bean请求提供一个实例,在每次注入时都会创建一个新的对象
request:bean被定义在每个HTTP请求中创建一个单例对象,在单个请求中都会复用这一个单例对象。
session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效
application:bean被定理为ServletContext的生命周期中复用一个单例对象。
websocket:bean被定义在websocket的生命周期中复用一个单例对象。
global-session(不常用):全局作用域,和Portrlet应用相关,应用部署在Portlet容器中工作时,你想声明让所有的portlet共用全局存储变量的话,那全局变量需要存储在global-session中。
Spring框架中的单例Bean是线程安全的吗
不安全的,框架并没有对bean进行多线程的封装处理
如果Bean是有状态的,那就需要开发者自己对线程进行安全保障,最简单的就是改变bean的作用域,把singleton改成protopyte,这样每次请求Bean就相当于是new Bean()
有状态就是有数据存储功能
无状态就是不会保存数据