Spring是一个轻量级Java开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/Java EE ful-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础加构支持。
Spring负责基础加构,因此Java开发者可以专注于应用程序的开发。
Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。
Spring 可以最很多事情,它为企业级开发提供了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入 (Dependency injection,DI)和面向切面编程(Aspect-oriented programing,AOP)。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略
Spring设计目标: Spring为开发者提供一个一站式轻量级应用开发平台
Spring设计理念: 在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OOP设计方法;Spring通过Ioc容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给Ioc容器,实现解耦;
Spring框架的核心: Ioc容器和Aop模块。通过AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件
优点:
方便解耦,简化开发
spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试
Spring对Junit4的支持,可以通过注解方便的测试Spring程序。
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts,Hibernate,Mybatis)
降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC,JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
缺点:
应用场景:JavaEE企业级应用开发,包括SSH、SSM等
Spring价值:
Spring总共大约由20个模块,由1300多个不同的文件构成。而这些组件被分别整合在 核心容器(Core)、AOP、设备支持、数据访问与集成、Web、消息、Test等6个模块中。以下是Spring 5的模块结构图:
这是基本的Spring模块,提供了Spring框架的基础功能,BeanFactory 是任何以spring为基础的应用的核心。Spring框架建立在此模块之上,它使Spring成为一个容器。
bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。
控制反转即为IOC ,它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
Spring IOC负责创建对象,管理对象(通过依赖注入DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
IOC实现原理就是工厂模式加反射机制
使用@Autowired注解来自动装配知道的bean。在使用@Autowired注解之前需要咋Spring配置文件进行配置,
在启动Spring IOC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到了@Autowired、@Resource、@Inject时,就会在Ioc容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名字来查找
如果上述查找的结果为空,那么会抛出异常。解决方法:使用required=false
@Component:这将Java类标记为bean,它时任何Spring管理组件的通用构造形式。Spring的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
@Controller:这将一个类标记为Spring Web Mvc控制器。标有它的Bean会自动导入到Ioc容器中
@Service:此注解时组件注解的特化。它不会对@Component注解提供任何其他行为。您可以在服务层中使用@Service而不是@Component,因为它以更好的昂是指定了意图。
@Repository:这个注解时具有类似用途和功能的@Component注解的特化。它为DAO提供了额外的好处,它将DAO导入IOc容器,并使未经检查的异常有资格转换为Sprig DataAccessException。
用于将特定Http请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可用于两个级别:
类级别:映射请求的URL
方法级别:映射URL以继HTTP请求方法
Spring通过提供ORM模块,支持我们直接在JDBC之上使用一个对象/关系映射(ORM)工具,Spring支持集成主流的ORM框架,如Hibernate、JDO和iBatis。Spring的事务管理同样支持以上所有ORM框架及JDBC
Spring DAO(数据访问对象)使得JDBC、Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无序考虑捕获每种技术不同的异常。
Spring 支持两种类型的事务管理:
编程式事务管理: 这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理: 这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,Spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
Spring有五大隔离级别,默认值为ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:
**脏读:**表示一个事务能够读取另一个事务中还未提交的数据。比如:某个事务尝试插入记录A,此时该事务还为提交,然后另一个事务尝试读取到了记录A
**不可重复读:**是指在一个事务内,多次读同一个数据。
**幻读:**指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一次查询时有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要由于编程式事务管理,虽然比编程式事务管理少了一点灵活性。唯一不足地方是,最细粒度只能作用到方法级别,无法左到像编程式事务那样可以作用到代码块级别。