Spring框架
Spring的概述
起因
Spring的出现是因为当时SUN公司EJB的失败 尤其是EJB2的时代,EJB2需要许多配置文件,还需要配合很多抽象概念才能使用。
虽然EJb3克服了配置方面的冗余 但是对于Javaee的开发而言 更为致命的是对EJb容器的依赖, 应用可以通过容器获得对应的Bean
EJB的缺点
rjb容器十分复杂
没有一个很好的设计理念 导致代码的可读性很差,导致后期的维护和开发很难
大量使用try catch finally 大多的程序员滥用 导致代码非常复杂
使用EJB需要从EJB容器中 获取服务,但是测试人员需要对面一个对象深度剖析,没有必要,导致测试人员的工作量很大
很多框架都有入侵性,也就是依赖性太严重
ejb3的缺点
首先他比较缓慢,容器中需要调用大量的远程调用 反射 代理 徐丽华和反序列化等复杂的操作
对EJB容器依赖比较重,难以带到快速开发和测试的目的
Spring框架的成功不在于它的技术 而在于他的理念,他最为核心的理念是Ioc (控制反转) 和AOP(面向切面编程) 其中IOc是spring的基础,而AOP其的重要功能,最为典型的是数据库事务的使用
Spring
作者
RodJohnson
优点
他是程序员乐意去使用的框架
他不依赖于Spring所提供的API 也就是无浸入性和低侵入性。也就是Java应用离开了Spring依然能用
Spring不是去取代原有的框架,而是将之前的框架 整合到Spring中
Spring提供的策略
对于POJO的编程 提供了 配置 xml和注解来扩展POJO
POJO
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
一个普通的java类对象 主要应用在数据库 作为对象的类
提供切面编程
提供了模板类,将各种技术整合到Spring中
他的理念包括
Ioc(控制反转)
SpringIoC概述
有点面向对象的意思
Spring Ioc里面装在的各种Bean,也可以理解为各种资源
Ioc是一个容器,在Spring中,他会认为一切java资源都是javaBean,容器的木匾就是管理这些Bean和他们之间的关系
控制反转
其中的控制权在SpringIoc容器中,他会根据描述找到使用者需要的资源,这就是控制反转的含义
控制反转是一种通过描述 (在java中如 注解和 xml) 并通过第三方去产生获取特定的对象的方式
将不同的事务交给不同的对象(接口) 去做
实现控制反转的是IOC容器
方法
依赖注入
本质目的
就是管理Bean
创建模式
优点
降低对象之间的耦合
主动创建模式下
责任归于开发者
被动创建模式下
责任归于IOc容器
对象被控制反转了
喝果汁的两种方式
主动创建对象
自己去买 原料和搅拌机
被动创建对象
去商店买,下订单
javaBean简介
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
装配 SpringBean
实现SpringIoc 的方式
依赖查找
通过资源定位符 进行查找
依赖注入
依赖注入的三种方式
构造器注入
原理
主要是通过java的反射技术
缺点
可读性差,因为他没有指定变量名而是采用坐标的方式
setter注入
setter注入方式是Spring中最主流的的注入方式
优点
灵活且可读性高
接口注入
不常用 主要是来源是外界
Spring的IOc容器中获得Tomcat所管理的数据库连接池
转配Springbean概述
Spring中三种配置方式
在xml中显示配置
注解
java类
Spring Bean的生命周期
主要是为了了解SpringIoc容器初始化和销毁Bean的过程
学习如何在初始化和销毁的时候加入自定义的方法
JavaBean的创建 时间行为等他们有Ioc容器管理
Spring是依靠描述来完成对象的创建及其依赖关系
Spring IOc容器
SpringIOc容器的设计
主要是基于BEanFactory和 其子接口 ApplicationContext两个接口
在通常情况下 一般是使用applicationContext接口 他实现了 Beanfactory接口, 并且他还有扩展了很多其他的接口 比如环境接口和 信息资源接口 和其他资源接口
会使用application的实现类ClassPathXmlApplicationContext去初始化Ioc容器 然后 开发者就可以通过Ioc容器来获取资源
Springioc容器的初始化 和依赖注入
Bean在容器中,先定义 后初始化和依赖注入
只有在使用时,才会去初始化Bean
bean的定义
Resource的定位
资源定位
BeanDefinition的载入
将定位到的信息保存到Bean容器中
BeanDefinition的注册
将BeanDefinition的信息发布到SpringIoc容器中
AOP(面向切面编程)
简介
SpringAOP常用于数据事务的编程
在SpringAOP实现的数据库事务管理中,是以异常作为消息,只要Spring接收到了异常消息 他就睡将数据库的事务回滚,从而保证数据的一致性
AOP的概念和使用原因
意义
首先 ,他可以拦截一些方法 然后把各个对象组织成一个整体
AOp 是通过动态代理模式,带来管控各个对象操作的切面环境
Spring 对 AOP的支持
AOP不是java 所私有的,Spring只是有AOP的框架之一
使用@aspectJ 注解开发 Spring AOP
使用XMl配置文件开发SpringAOp
面向切面编程
如果说Ioc是Spring的核心,那么面向切面编程就是Spring最为重要的功能之一
在数据库事务中切面编程被广泛使用
AOP原理是Spring技术中最难理解的一部分
一个简单的约定游戏
通过接口 实现一个拦截器
通过接口去实现一个产品的类对象
数据库实现了拦截器
通过作者写的代码实现 关联
通过jdk动态代理实现的
切面编程的术语
切面
在一个怎样的环境中工作
通知
切面的方法,比如拦截器
比如 before,after
引入
引入我们现有类的自定义方法和类
切点
这是一个高速Spring AOp 在什么时候启动拦截并植入 对应的流程中,他往往需要正则来限定 启动
连接点
链接点 对应的事具体需要拦截的东西 ,比如 产品的方法
织入
织入 是一个生成代理对象并将切面内容放入到流程中的过程
AOP应用
SPring 和数据库编程
SPring 最重要的功能毫无以为就是操作数据
数据库编程 是互联网编程的基础
Spring 对已有的框架提供支持
Hibernate
支持
Mybaties
不支持,但是mybaite 社区提供了开发Spring的开发包
传统jdbc代码的弊端
太多的trycatch 代码块 ,导致代码冗余
配置数据库资源
在实际工作中大部分会 配置为数据库连接池
获取数据源
使用SPring内部提供的类
使用第三方方数据库连接池
从web服务器中通过jndi获取数据源
jdbc代码失控的解决方案
jdbcTemplate
虽然不算成功,但是体现了 SPring框架的主导思想之一
给予常用个技术提供模板化的编程 减少了开发者的工作量
jdbcTemplate的增删改查
Mybatis -Spring 项目
目前大部分的java互联网项目,都是用Spring MVC + mybatis + Spring 搭建平台的
使用Spring IOc 可以有效的管理 各类的java 资源 达到即插即拔的功能
通过 AOP 框架,数据事务委托给Spring处理,消除很大一部分的事务代码
配合Mybatis的搞灵活 可配置 可优化SQL、完全可以构建高性能的大型网站
mybatis和Spring 框架的结合的好处
使业务层和模型层得到了更好的分离
在SPring 环境中使用mybats 更加的简单, 节省了 不少代码,甚至可以不用SqlSessionFactory,SQlSession等对象,因为 mybatis为我们封装了他们
深入Spring数据库事务管理
数据库事务 是企业应用 最为重要的内容之一
Spring数据库事务 管理器的设计
在Spring中可以使用声明式事务
声明式事务 可以分为xml配置 和注解事务,但是 xml也不常用了,目前主流方法是注解@Transactional
声明事务是一种约定型的事务
或者是编程式事务
现在已经不用了 主要原因就是产生冗余,代码可读性较差
换句话说,事务将开发者通过自己的代码来实现
数据库的相关知识
数据库事务acid特性
原子性
要么全部完成 ,要么全部不完成
一致性
事务必须始终保持系统保持一个状态
隔离性
它是指连个事务之间的隔离程度
持久性
该事务对数据库所做的更改便持久保存在数据库之中
丢失更新
第一类丢失更新
数据变少
第二类丢失更新
数据变多
隔离级别
脏读
读/写提交
可重复读
序列化
为了克服幻读
就是修改了 但是有几个新加的没有修改 导致 第一个事务 出现幻觉