spring是什么?
轻量级容器框架,用来装java bean对象,简化应用程序的开发
主要包括:IOC控制反转,AOP面向切面,声明式事务,粘合剂
谈谈你对IOC的理解
容器概念,控制反转,依赖注入
IOC容器:一个map,存放java bean对象,@repository,@Service,@Controller,@Component,在启动时扫描这些配置,放进容器,用的时候再依赖注入
控制反转:传统控制对象从主动new变为spring分配被动接受,则其为反转
如何一个实现IOC容器
1.写一个配置文件扫描包路径
2.定义一些注解,表示Controller,Service,Dao,依赖注入,配置文件
3.递归包获取所有.class文件,将其存在Set集合
4.遍历Set集合并反射获取类,找到对应注解的类,交给IOC容器,并用安全Map存储
5.遍历IOC容器,获取实例,若依赖其它类,则对其进行依赖注入
BeanFactory和ApplicationContext的区别
beanfactory懒加载,仅提供了实例化和拿对象的功能,。
ApplicationContext饿加载,有很多功能:
支持国际化
统一的访问资源方式
提供监听器中注册bean的事件
同时加载多个配置文件
载入多个上下文使得每一个上下文都专注于一个特定的层次,比如应用的web层
Spring bean的生命周期
粗略的说有四个:
!实例化
!属性赋值
!初始化
!销毁
所谓bean的声明周期,就是bean的创建和销毁过程的步骤
1.BeanDefinition对象创建
顾名思义,bean的定义,Spring利用beandefinition来创建bean,比如需要利用它的beanClass属性确定bean的类型,从而实例化对象
2.构造方法推断
一个bean有多个构造方法,需要Spring判断使用哪个,通过构造方法推断后确定一个,就可以用构造方法实例化得到一个对象了
3.实例化
构造方法反射得到一个实例化对象,Spring中通过BeanPostProcessor机制对实例化进行干预。
4.属性填充
实例化得到的对象是不完整的,尚未对某些属性填充,也就是平常说的依赖注入
5.初始化
一个对象的属性填充后,Spring提供了初始化机制,开发人员可以用初始化对bean自定义加工,比如利用InitializingBean接口对bean其它属性进行赋值,或对bean的某些属性校验
6.初始化后
bean创建的最后一步,如AOP就是在BeanPostProcessor机制实现的,初始化后得到的对象才是真正的bean对象,如果当前创建的Bean是单例,则把bean放入单例池
7.销毁
Spring容器关闭时,调用DisposableBean中destroy()方法
Spring bean 作用域
单例(singleton):(默认)每一个Spring IoC容器都拥有唯一的一个实例对象
原型(prototype): 一个Bean定义,任意多个对象
请求(request): 一个HTTP请求会产生一个Bean对象,也就是说,每一个HTTP请求都有自己的Bean实例。只在基于web的Spring ApplicationContext中可用
会话(session): 限定一个Bean的作用域为HTTPsession的生命周期。同样,只有基于web的Spring ApplicationContext才能使用
全局会话(global session): 限定一个Bean的作用域为全局HTTPSession的生命周期。通常用于门户网站场景,同样,只有基于web的Spring ApplicationContext可用
Spring 的单例Bean线程安全吗
不是
Spring有哪些设计模式和应用场景
简单工厂:比如beanFactory
单例模式:Spring创建实例默认都是单例
动态代理:AOP容器会为目标对象创建一个代理对象
策略模式:Spring访问Resource接口,该接口提供了强大的资源访问能力
Spring事务的实现方式
事务是基于数据库的,Spring提供的只是给数据库的事务进行扩展
事务分为编程式和声明式,编程式就是普通数据库中的begin end语句,声明式就如Spring的@Transactional注解
在某个方法加上@Transactional则开启事务,此方法中的所有sql都会在一个事务中进行,原理是:Spring基于这个类生成一个代理对象作为bean,当使用它的方法时,如果有此注解,则代理会把自动提交设为false,然后再执行业务逻辑,如无异常,代理就提交事务,有则回滚。默认是运行时异常和error回滚,可以在注解中设置属性rollbackFor=xxx配置
Spring事务的隔离级别
Spring的隔离级别就是数据库的隔离级别:
未提交读:
提交读,不可重复读: Oracle默认
可重复读: MySQL默认
可串行(xing)化: