Spring知识点详解
一:概述
一、简介
1. 概念
1. Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的开源容器框架,它由Rod Johnson(音乐学博士)创建。
2. Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。
2. 作用:解决企业应用开发的复杂性
3. 特点
1. 方便解耦,简化开发:管理所有对象的创建和依赖的关系维护。
2. AOP编程的支持:方便的实现对程序进行权限拦截、运行监控等功能。
3. 声明式事务的支持:通过配置完成对事务的管理,而无需手动编程。
4. 方便程序的测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5. 方便集成各种优秀框架:内部提供了对各种优秀框架的直接支持。
6. 降低JavaEE API的使用难度:封装JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)。
二、体系结构
1. 核心容器(Core Container)
1. Spring-core模块:提供了框架的基本组成部分,包括控制反转(IOC)和依赖注入(DI)功能。
2. Spring-beans模块:提供了BeanFactory与Bean的装配,使Spring成为一个容器。
3. Spring-context模块:应用上下文,建立在1和2基础之上,提供一个框架式的对象访问方式,是访问定义和配置任何对象的媒介,使Spring成为一个框架。
4. Spring-context-support模块:支持整合第三方库到Spring应用程序上下文,特别是用于高速缓存(EhCache、JCache)和任务调度(CommonJ、Quartz)的支持。
4. Spring-expression模块:提供了强大的表达式语言(扩展的EL)去支持运行时查询和操作对象图。
2. 中间层
1. Spring-aop模块:提供了一个符合AOP要求的面向切面的编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以便干净地解耦。
2. Spring-aspects模块:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的AOP框架。
3. Spring-instrument模块:提供了类植入(Instrumentation)支持和类加载器的实现,可以在特定的应用服务器中使用。
4. Spring-messaging模块:提供了对消息传递体系结构和协议的支持。
3. 数据持久层(Data Access/Integration)
1. Spring-jdbc模块:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析。
2. Spring-orm模块:提供一个对象关系映射(Object-Relational Mapping)API框架,包括JPA和Hibernate。
3. Spring-oxm模块:提供了一个支持对象/XML映射的抽象层实现,例如JAXB、Castor、JiBX和XStream。
4. Spring-jms模块:指Java消息传递服务,包含用于生产和使用消息的功能。
5. Spring-tx模块:支持用于实现特殊接口和所有POJO类的编程和声明式事务管理。
4. Web层
1. Spring-web模块:提供了基本的Web开发功能,例如多文件上传功能、使用Servlet监听器初始化一个IOC容器以及Web应用上下文。
2. Spring-webmvc模块:提供了Web应用程序的Spring MVC和REST Web Services实现。
3. Spring-websocket模块:提供了WebSocket和SocketJS的实现。
4. Portlet模块:类似于Servlet模块的功能,提供了Portlet环境下的MVC实现。
5. 测试
Spring-test模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。
三、环境配置
1. 安装STS(集成了Spring的Eclipse)
1. 解压安装
2. 修改编码格式及字体
2. 依赖配置
1. 依赖日志
3. 导入jar包
二:IoC
一、概述
1. 概念:Inversion of Control,简称IoC,翻译为“控制反转”,于1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中提出。
2. 作用:完成对象的创建和依赖的管理注入。
3. 实现原理
1. 概括:借助于“第三方”实现具有依赖关系的对象之间的解耦,相当于“粘合剂”。
2. 精确:把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
4. DI(依赖注入)
1. 概念:Dependency InjectionI,简称DI,翻译为“依赖注入”,是Martin Fowler探讨IoC的那些控制被反转时给“控制反转”起的更合适的名字。
2. 结论:在IoC容器运行期间,动态地将某种依赖关系注入到对象之中,也就是说获得依赖对象的过程被反转了。
3. DI和IoC区别: 依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。
二、体系结构
1. BeanFactory:最典型的Bean工厂,定义了IoC容器的基本功能规范。
1. 体系图
1. ListableBeanFactory:表示这些 Bean是可列表的
2. HierarchicalBeanFactory:表示Bean的继承关系
3. AutowireCapableBeanFactory:定义Bean的自动装配规则
2. 功能
3. 实现(不推荐)
2. ApplicationContext:在BeanFactory基础之上,提供了对资源访问,国际化、事件传播等功能的支持。
1. 体系图
1. ConfigurableApplicationContext:提供了通过各种途径去加载实例化bean的方法。
2. WebApplicationContext:提供了注册注解类和扫描注解类等操作、
3. ClassPathXmlApplicationContext:从类路径中获取上下文定义文件
4. FileSystemXmlApplicationContext:从文件系统或url获取上下文定义文件
2. 实现
三、依赖注入
1. 属性注入(setter方法)
1. 常量类型
2. 对象类型
3. 集合类型
2. 构造器注入
1. 常量类型
2. 对象类型
3. 集合类型
3. 内部Beans注入
三:Bean
一、Bean的实例化
1. 实例化
1. 通过无参构造
2. 通过静态工厂
3. 通过实例工厂
4. 实现FactoryBean接口
二、Bean的作用域
1. 基于配置文件
1. singleton作用域
2. prototype作用域
2. 基于注解
三、Bean的生命周期
1. 创建Bean
2. 装配Bean
3. 测试
四、Bean的装配方式
1. 基于配置文件
2. 基于注解
1. 注册Bean(四个组件功能一样,以下只是习惯用法):开启注解扫描<context:component-scan base-package="" />
1. @Component:pojo层
2. @Controller:表现层
3. @Service:业务层
4. @Repository:持久层
5. @Configration:注解类,可以使用 Spring IoC 容器作为 bean 定义的来源
2. 使用Bean(消除set和get方法):开启注解扫描:<context:annotation-config />
1. @Autowired:可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,默认按类型装配。
2. @Resource:可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,默认按名称装配。
3. @Value:装配简单类型和配置文件属性
3. 初始化和销毁
四:AOP
一、概述
1. 简介:AOP(Aspect Oriented Programming)为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
2. 作用:采取横向抽取机制,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中提取出来,解决了传统的纵向继承体系的代码重复问题,降低业务逻辑各个部分之间的耦合性,提高程序的可重用性,同时提高了开发的效率。
3. 核心概念
4. 增强类型
5. AspectJ
1. 概念:AspectJ是一个基于Java语言的AOP框架。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
2. 语法:execution(<修饰符>?<返回类型> <方法名>(<参数模式>) <异常模式>?)
3. 示例
二、动态代理
1. JDK动态代理:必须提供接口,其内定义的方法都会实现,有必要时可以做过滤。
1. 创建业务层接口(目标对象)及实现
2. 创建切面类,定义多个增强处理
3. 创建代理类,编写代理方法,实现动态代理
4. 测试
2. CGLIB动态代理:高性能开源的代码生成包,对指定的目标类生成一个子类并增强,解决了没有提供接口的类。
1. 创建目标类(目标对象)
2. 创建切面类,定义多个增强处理
3. 创建代理类,编写代理方法,实现动态代理
4. 测试
三、AOP开发
1. 基于XML配置开发AspectJ
1. 创建业务层接口及其实现(目标对象)
2. 创建切面类,模拟各种类型的增强
3. 创建配置文件,编写相关配置
4. 测试
2. 基于注解开发AspectJ
1. 创建业务层接口及其实现(目标对象)
2. 创建切面类,模拟各种类型的增强
3. 开启注解解析器
4. 测试
五:事务管理
一、Spring JDBC
1. 创建并编写配置文件
2. 创建数据访问层Dao
二、事务概述
1. 事务(Transaction)的概念
1. 什么是事务:事务是逻辑上的一组操作,要么都执行,要么都不执行。
2. 事务的特性(ACID)
1. 原子性(Atomicity):事务是最小的执行单元,要么都执行,要么都不执行。
2. 一致性(Consistency):事务执行前后,数据保持一致;
3. 隔离性(Isolation):并发访问数据库时,一个用户的事物不被其他事物所干扰,多个并发事务之间数据库是独立的。
4. 持久性(Durability): 当事务提交后,它对数据的改变是永久的,即使数据库发生故障也不应该对其有任何影响。
3. 事务并发导致的问题
1. 第一类丢失更新(回滚丢失):撤销一个事务时,把其他事务已提交的更新数据覆盖。
2. 脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据。
3. 不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。
4. 幻读(虚读):一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致。
5. 第二类丢失更新(覆盖丢失):如果两个事物都读取同一行,然后两个都进行写操作并提交,第一个事物所做的改变就会丢失。
3. 事务的隔离级别
2. 事务管理API
1. PlatformTransactionManager(事务管理器):按照给定的事务规则来执行提交或者回滚操作。
2. TransactionDefinition(事务定义信息):事务的隔离级别、传播规则、超时、只读和回滚规则。
3. TransactionStatus:事务运行状态
三、事务管理
1. 基于xml配置
1. 创建Dao层
2. 创建Service层
4. 创建配置文件(在JDBC配置文件基础之上)
5. 测试
2. 基于注解
1. 创建配置文件
2. Service层加
3. 基于JavaConfig
1. 创建配置类
2. 配置Service层
3. 测试