spring框架

本文详细介绍了Spring框架的核心概念、优势、结构及其事务管理等内容。通过解释依赖注入、面向切面编程等关键技术,帮助读者理解Spring如何简化Java应用开发。

一、spring介绍

spring是一个轻量级的java开源框架,由于它开源和低侵入性,在市场上占有率相当高;它的核心是核心思想是DI(依赖注入)和IOC(控制翻转),我先解释一下这个名词,IOC(控制反转):这个是spring的核心,它把之前需要在业务中维护的对象依赖关系交给spring容器去管理,开发人员不需要去创建对象,只要在需要调用的地方直接从容器中取就可以了,而这种原来由自己维护对象关系现在交给spring容器来管理的方式就叫做IOC;IOC是目的,DI是手段,IOC是指让生成类的方式由传统方式(new)反过来,既程序员不调用new,需要类的时候由框架注入(DI),是同一件不同层面的解读;

二、为什么要用spring,spring有哪些优势?

1、轻量级

相对于EJB这种重量级的容器而言,spring的IOC是完全不依赖于底层容器,零侵入性的设计。便于开发测试,相对于EJB来说,spring部署方便,而且可以运行在任何j2ee支持的容器上,或者app中;

2、控制翻转(IOC)

spring使用控制反转技术实现了松耦合,依赖注入对象,而不是创建或者寻找依赖对象;

3、面向切面(AOP)

AOP是指面向切面编程,是java面向对象编程的一个补充,解决了面向对象中的不足,spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来;AOP使用场景常用在日志记录、事务管理性能检测、安全认证等方面,而且AOP有很多的专有名词:切点、连接点、织入、切面等;

AOP的实现原理:AOP是一种面向过程的编程思想,它的实现原理主要是java的动态代理,而spring对动态代理的支持有两种方式,一种是默认的JDK实现,一种是CGLIB实现。

(1)JDK动态代理

jdk的动态代理是spring的默认实现,它是基于接口,代理类和被代理类必须实现同一个接口。

(2)CGLIB动态代理

cglib在spring的支持是需要在配置中指定(默认是通过JDK的方式实现),它不要求基于接口,它是通过子类继承的方式,利用回调来实现代理的。

4、事务管理

spring有强大的事务管理功能,支持声明事务和编程事务,能够处理本地事务(一个数据库)或是全局事务(多个数据库,采用JTA);

5、异常处理

由于java的JDBC,hibernate等API中有很多方法抛出的是checked  exception,但是很多开发者并不能很好的处理异常。spring提供了统一的API将这些checked  exception转换成了spring的unchecked  exception;

6、springmvc框架

spring实现了自己的一个mvc框架,性能优越性很高,可以替换struts2,并且不需要考虑和spring整合的问题;

三、spring的结构

先上个图:

1、核心容器

这是spring框架的最基础的部分,它提供了依赖注入(DependencyInjection,简称DI)的方式来实现容器对bean的管理。这里最基本的概念是beanFactory,它是任何spring应用的核心。beanfactory是工厂模式的一个实现,它使用IOC将应用配置和依赖说明从实际的应用代码中分离出来;

2、应用上下文模块(Context)

核心模块的BeanFactory使spring成为一个容器,而上下文模块使它成为一个框架,这个模块扩展了beanFactory的概念,增加了对国际化(I18N)消息,事件传播以及验证的支持;

3、spring的AOP模块

spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在spring应用中实现切面编程的基础。spring的AOP模块也将元数据编程引入了spring,使用spring的元数据支持,你可以为你的代码增加注释,指示spring在何处以及如何应用切面函数;

4、JDBC抽象和DAO模块

使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保证你的数据库访问代码干净整洁,并且可以防止因关闭数据库资源失败而引起的问题。

5、对象/关系映射集成模块

对那些更喜欢使用对象/关系映射工具而不是直接使用JDBC的人,spring提供了ORM模块。spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案,包括hibernate、JDO和ibatis  sql映射,spring的事务管理支持这些ORM框架中的每一个也包括JDBC。

6、spring的web模块

web上下文模块建立于应用上下文模块之上,提供了一个适合于web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了spring和其它web框架的集成,比如struts、webwork。

7、spring的mvc框架

spring为构建web应用提供了一个功能全面的mvc框架。虽然spring很容易和其它mvc框架集成,比如struts,但是spring的mvc框架使用IOC对控制逻辑和业务对象提供了完全的分离;

四、spring的生命周期

spring的生命周期其实就是bean的生命周期,从bean开始被装载,然后默认的以单例的形式实例化,然后是属性注入,然后是被装载到beanFactory,然后调用销毁方法;

beanFactory和ApplicationContext的区别:beanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。Application除了提供上述BeanFactory所提供的功能外,还提供了更完整的框架功能:国际化支持、资源访问、事件传递等。

五、spring实例化bean的方式

1、通过构造来实例化bean,这也是spring中最常用的,被实例化的bean一定要有默认的构造方法,如果是有参构造,必须在bean的配置中指定构造参数,否则bean将不能被实例化。

2、静态工厂,这个只需要在bean中指定属性factory-method:参数为静态工厂类的生产对象的静态方法。

3、实例工厂,这个和静态工厂很相似,一般在bean中需要批定两个属性factory-bean:工厂类的实例;factory-method:工厂类生产对象的方法;

六、spring各种事务实现及区别

先上个图:

从上图中可以看出spring的事务配置包括三部分:Datasource,TransactionManager,代理机制。三种Datasource对应三种TransactionManager事务管理器,spring的五种事务配置其实这里指的是它的代理机制。spring常用事务及实现原理,JDBC Datasource中的事务是通过Connection来实现的,Hibernate事务是通过session实现的,JTA的事务一般是通过JNDI来实现的。除此之外JDBC事务和hibernate事务是对单一数据库进行操作,通常不会同一个connection来操作两个数据库,而hibernate中一般一个sessionFactory对应一个数据库,更不会在一个session中操作两个数据库了,如果访问不同的资源,上面的事务就不能满足了,这时候必须选择JTA事务,而分布式部署则要使用XA事务才行。

七、spring的事务属性

事务的几种传播特性:

1、PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务,如果没有事务则开启。

2、PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务,如果没有事务,就是非事务的。

3、PROPAGATION_MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

4、PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

5、PROPAGATION_NOT_SUPPORTED:总是非事务的执行,并且挂起任何存在的事务。

6、PROPAGATION_NEVER:总是非事务的执行,如果存在一个活动的事务,则抛出异常。

7、PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。

spring事务的隔离级别:

1、ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。

另外四个与JDBC的隔离级别相对应:

2、ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读,不可重复读,和幻读。

3、ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交之后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

4、ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读,但是可能出现幻读。

它除了保证一个事务不能读取另一个事务未提交的数据外,还保证避免不可重复读。

5、ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行,除了防止脏读,不可重复读外,还避免了幻读。

八、spring的编程式事务和声明式事务的区别

对于编程式事务,它的一般步骤是:开启手动事务,处理业务、提交事务、异常中回滚事务、finally中关闭事务,在代码中需要手动完成;但是我们这里提到的是spring中的编程事务,所以一般的做法是在bean.xml中声明一个事务类型、声明一个事务模板(注入声明的事务),在业务service中使用我们的事务模板。编程式事务的使用场景一般是事务比较简单且业务不复杂的应用中推荐。编程式事务的优点:容易控制边界,粒度细;缺点是侵入性强。

声明式事务,方式一(通过使用代理增加的方式配置):创建一个代理的工厂bean(如TransactionProxyFactroryBean),然后设置业务类接口属性,然后注入接口的实现类,然后注入事务管理器,然后注入事务属性(在上面已经提到,配置事务的隔离级别和传播特性);方式二(常用的):声明一个数据源,声明一个事务管理类,声明一个Advice(设置一些spring事务属性),定义切面指定事务的作用范围。声明式事务的优点是,侵入性配置方便,缺点是边界不容易控制。

转载于:https://my.oschina.net/ayo123/blog/870993

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值