简单介绍下Spring?
Spring是一个开源的框架,目的是在简化java开发,提高开发效率,他有三大核心组件,IOC(控制反转) , DI(依赖注入) , AOP(面向切面编程)
谈谈你对SpringIOC的理解
springIOC是Spring的核心组件,IOC是一种设计模式,控制反转,反转的是对象的创建权,将对象的创建交给spring来管理
spring中的bean是线程安全的吗?
不是安全的,从某种意义上讲是安全的,因为他是无状态的,没有存储数据
解决方法有两种:
1.修改bean的作用域,singleton改为非单列 prototype
将共享变量放到Threadlocal线程中,Threadlocal是线程私有变量,线程间隔离,解决了线程安全问题
Spring AOP和AspectJ AOP有什么区别?
Spring AOP是运行时增强,AspectJ AOP是编译时增强
springaop是基于代理,AspectJ AOP是基于字节码操作
AspectJ功能相对springaop更加强大,如果切面比较少的话,可以选择SpringAOP,如果切面相对比较多的时候选择AspectJ相对springaop快
Spring中的bean生命周期?
BeanDefinition -> 实例化 -> 依赖注入 -> 初始化 -> 使用 -> 销毁
1.先通过配置文件或者注解拿到所有的BeanDefinition,然后将他们放到BeanDefinitionMap中
2.从BeanDefinitionMap中拿到bean定义并进行实例化 new
3.对bean属性进行赋值
4.对属性进行赋值
5.初始化完成后,bean真正创建完成,将bean放到spring容器中,ConcurrenthashMap 然后通过getbean就可以拿来使用了
6.容器销毁时,bean也会随之销毁
Spring 框架中都用到了哪些设计模式?
1.工厂模式:BeanFactory就是工厂模式的简单体现,创建对象的实例
2.代理模式:springaop就是基于动态代理模式,动态模式基于JDK的动态代理和CGLIB字节码技术
3.单例模式:bean默认是单例模式
4.模板方法:解决重复代码的问题
5.观察者模式:定义对象间的一种一对多的依赖关系,一个对象状态发生变化时其他依赖对象可以得到通知被制动更新
你用到Spring中的哪些注解 ?
@Component :标识了一个受Spring管理的组件,泛指组件
@Respository: 标识持久层,数据访问组件,即DAO组件
@Service: 标识业务层组件
@Controller :标识表现层,控制层组件
@RequestMapping 是用来处理请求地址映射的注解,可用于类或方法上
@Resource和@Autowired都是做bean的注入时使用,都可以写在字段上,或者是setter方法上
Spring事务管理的方式有几种?
声明式事务:实现方式有两种,基于XML的配置文件和注解的形式实现
编码方式:提供编码的形式管理和维护事务
Spring事务中的隔离级别有哪几种?
读未提交:ISOLATION_READ_UNCOMMITTED
读已提交:ISOLATION_READ_COMMITTED
可重复读:ISOLATION_REPEATABLE_READ
串行化:ISOLATION_SERIALIZABLE
MySQL默认的隔离级别是可重复读(ISOLATION_REPEATABLE_READ),Oracle默认使用的隔离级别是读已提交(READ_COMMITTED)
Spring中什么时候 @Transactional会失效?
如果某个方法被private修饰,@Transactional会失效,因为底层使用的CGLIB技术,子类不能重载父类的private()方法,所以@Transactional会失效
Spring的事务传播行为?
事务传播行为:指的是一个事务方法被另外一个事务方法调用
1.PROPAGATION_REQUIRED,如果当前没有事务,创建一个新的事务,如果存在事务,则加入当前的事务,这是spring默认的事务处传播方式
2.PROPAGATION_SUPPORTS:支持当前是事务,如果存在事务就加入,没有事务就以非事务执行
3.PROPAGATION_MANDATORY:支持当前事务,如果存在就加入事务,没有抛出异常
4.PROPAGATION_REQUIRES_NEW:创建新事务,不管存不存在事务都会创建新的事务
5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果存在事务就将当前事务挂起
6.PROPAGATION_NEVER:以非事务方式执行,如果存在事务,就抛出异常
7.PROPAGATION_NESTED:如果当前存在事务就在当前事务嵌套执行,如果没有事务就按照默认执行方式执行
BeanFactory和ApplicationContext有什么区别?(高频)
BeanFactory是懒加载,不会在容器启动的时候就去实例化bean,而是从容器中拿出的时候才会实例化bean
ApplicationContext是在容器加载的时候就全部实例化bean,可以为bean配置lazy-init=true来延迟实例化前期占用资源大
Spring Bean有哪些作用域,它们之间有什么区别?(高频)
singleton:单例他是beanfacatory自身来维护的,这种bean不管接收多少请求容器中只有一个bean的实例
prototype:非单例,为每一个请求的bean提供一个实例
request:会为每一个客户端的请求创建一个bean实例,请求结束bean会被垃圾回收器回收
session:session过期bean会随着销毁,每一个session中有一个bean实例