重新认识Java--Spring

Spring是什么:

Spring是一个轻量级的控制反转和切面编程的容器框架。其中主要包括IOC和AOP。

IOC:

控制反转,依赖注入。控制反转,在没有IOC之前,我们使用对象的时候是通过new的方式去创建对象,控制权是在程序员手上,有了IOC之后,IOC容器会主动去创建对象,当使用的时候IOC会自动注入,控制器颠倒了,这就是控制反转。依赖注入是指在控制权反转之后,获取对象的过程由自己控制变成了IOC容器主动注入,在IOC容器在运行期间,动态的将某种依赖关系注入到对象中。实际上就是个Map,里面存放的是各种对象,在项目启动的时候会读取配置文件中的bean节点,使用反射创建对象放到map里。在我们代码中需要用到里面对象的时候,通过DI注入。

AOP:

将程序中的交叉业务逻辑封装成一个切面,然后注入到目标对象

BeanFactory和ApplicationContext:

ApplicationContext是BeanFactory的子接口,ApplicationContext提供了更完整的功能。BeanFactory采用延迟加载的方式注入Bean,只有在用到某个Bean的时候才回去加载实例化,这样我们就不能发现一些存在的Spring的配置问题,如果Bean的某个属性没有注入,BeanFactory加载后,直至第一次使用到GetBean方法才会抛出异常。ApplicationContext是在容器启动的时候,一次性创建了所有的Bean,这样在容器启动的时候我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入,ApplicationContext启动后预载入所有的单实例Bean,确保在使用到时候,可以直接拿去用。BeanFactory以编程的方式创建,ApplicationContext还可以用声明的方式创建,比如使用ContextLoader。ApplicationContext的缺点是占用内存空间,当程序配置Bean比较多的时候,程序启动较慢。

Spring支持的几种bean的作用域

singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护,对该对象的生命周期是与SpringIOC容器一致的,第一次被注入的时候才会去创建。
prototype:为每一个bean请求提供一个实例,每次注入都会创建一个对象,原型模式。
request:每个http请求中创建一个单例对象,
session:与request返回类似,确保每个session中有一个bean实例。

Spring框架使用的设计模式

简单工厂,由一个工厂类传入参数,动态确定应该创建哪个产品类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。
工厂,通常我们用new来创建新对象,为了将对象的创建和使用相分离采用工厂模式,spirng中的bean的创建是由IOC进行创建的。
单例,保证一个类仅有一个实例,并提供访问它的的全局访问点。spring对单例的实现:spring提供了全局的访问点BeanFactory。
观察者模式:定义对象之间一对多的依赖关系,当一个对象发生变化了,所有依赖他的对象都会得到通知并更新。
策略模式:定义好一系列的算法,封装起来,可以相互替换,可以根据用户的实际情况来选用。
除以上外还有适配器模式,包装器模式,代理模式。

Spring事务的实现方式和原理以及隔离级别:

Spring有两种使用事务的方式,一种是编程式的,一种是声明式的,@Transactional注解就是声明式的。事务的概念是数据库层面的,Spring只是基于数据库的事务进行扩展,提供一些能让程序员更加方便操作事务的方式。比如我们可以通过在某个方法上增加@Transactional注解来开启事务,这个方法中所有的sql都会在事务中执行。Spring的事务隔离级别就是数据库的隔离级别,外加一个默认级别。未提交读,不可重复读(orocal),可重复读(mysql),可串行化。当spring与数据的隔离级别不一致时,以spring为准,如果spring的隔离级别数据库不支持,则效果取决于数据库。

Spring的事务传播机制

required默认,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务。
supports当前存在事务,则加入当前事务,如果当前没有事务,则以非事务方法执行。
mandatory当前存在事务,加入当前事务,如果当前事务不存在,则抛出异常。
requires_new创建一个新事务,如果存在当前事务,则挂起该事务,事务a和事务b互不相影响。not_supported以非事务方法执行,如果当前存在事务,则挂起当前事务,a,b方法不理会该事务。never不使用事务,如果当前事务存在,抛异常。

Spring事务什么时候会失效

Spring事务的原理是AOP,进行切面增强,失效的根本原因是这个AOP不起作用了。发生自调用,类里面使用this调用本类的方法。方法不是public的,@Transactional只能用于public的方法,否则事务会失效,如果要在非public方法上使用,则可以开启Aspectj代理模式。数据库不支持事务(mysql使用myisam引擎无事务)。没有被spring管理。

SpringBoot、SpringMvc、Spring有什么区别

Spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补代码重复问题,更方便的将不同类不同方法中的共同处理抽取成切面,自动注入给方法执行,比如日志,异常等。
SpringMvc是spring对web框架的一个解决方案,提供了一个总的前端控制器,用来接收请求,然后定义一套路由策略及适配器,将结果使用视图解析技术生产视图展现给前端。
SpringBoot是spring提供的一种快速开发工具包,让程序员更加方便更加快速的开发Spring+SpringMvc应用,简化了配置(约定了默认配置),整合了一系列的解决方案(starter机制)、redis、mongodb、es等开箱即用。

上一篇:Spring整合MyBatis要点


下一篇:BeanFactory和FactoryBean的区别