一、Spring 的开源框架
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
二、Spring 的基本概念
- Spring 是开源的轻量级框架,开源是对外开放源码,轻量级是不需要依赖其他框架就可以使用
- Spring 的两个核心:
- 面向切面(Aop:Aspect oriented Programming):扩展功能不是修改源代码实现,我的理解AoP已经将这些公共的可重用的模块(aspect)抽离出来(比如安全/日志/事务等),封装成一个切面,然后我们在扩展功能时只需要将这些注入到目标对象中(切面),这时候只需要考虑我们自己的业务逻辑即可。
- 控制反转(IoC:Inversion of Control):它是一种设计思想,就是通过容器控制应用程序需要的外部资源的创建和管理(.xml中配置),然后将其反转给应用程序,对象及其依赖对象的创建和维护都不需要应用程序去实现,将其交给IoC去管理。比如有一个类,类里面有一个方法(不是静态方法),要调用这个类里面的方法,需要创建类对象(new)才可以访问这个方法,现在不需要通过new对象,而是交给Spring进行配置给他创建类的对象。
- Spring 是一站式框架
- Spring 在JavaEE 三层结构中,每一层都提供不同的解决方案
- web 层(表现层):SpringMVC
- service 层(业务逻辑层):Spring 的IoC 和AOP
- dao 层(持久层):Spring 的JDBCTemple
- Spring 框架的六大模块:
- Spring DAO: Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。
-
Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。
-
Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。
-
Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。
-
Spring JEE:J2EE开发规范的支持,例如EJB 。
-
Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。
三、Spring 的IoC 的创建
- 把对象的创建直接交给Spring进行管理
- IoC操作两部分
- IoC 的配置方式
- IoC 的注解方式
- IoC 的底层原理
- xml 的配置文件
- dom4j 解析xml
- 工厂设计模式
- 反射
四、Spring 的Bean 管理(xml 方式,不推荐)
- Bean 实例化的方式
- 在Spring 里面通过配置文件创建对象
- Bean 实例化的三种方式
- 使用类的的无参构造创建
- 使用静态工厂创建
- 使用实例工厂创建
- Bean 标签常用的属性
- id 属性: 起的名称,id 属性值名称任意值,但不能有特殊值
- class 属性:创建对象所在类的全路径
- name 属性:功能和id 属性一样的,但是可以包含特殊符号(现在基本不用了,以前Struct1 会用)
- scope 属性:有多个属性值,1)singleton 单例,默认值 2)prototype 多例的
- Bean 的属性注入
- 创建对象时向类里面的属性设置值
- 属性注入的方式介绍(三种方式:set 方法注入;有参构造注入;使用接口注入)
- 在Spring 的框架中只支持前两种方式
- set 方法注入
- 有参构造注入
- 注入对象类型属性(重点)
- 创建service 类和 dao 类
- 在service 中把定义一个dao 类型的属性
- P 名称空间的注入
- 注入复杂类型:数组,list 集合,map 集合,properties文件
-
- IoC 和DI 区别
- IoC:控制反转,把对象创建交给Spring 配置
- DI:依赖注入,向类里面的属性设置值
- 关系:依赖注入不能单独存在,DI 需要在IoC 的基础之上完成操作
- Spring 整合Web 项目原理
- 加载Spring 核心配置文件
- new 对象功能可以实现,但是效率很低
- 实现思想:把加载配置文件和创建对象过程,在服务器启动时完成
- 实现原理:1)ServletContext 对象 2)监听器
- 具体实现 --在服务器启动时为每个项目创建一个ServletContext 对象
--在ServletContext 对象创建时候,使用监听器可以具体到ServletContext 对象在什么时候创建
--使用监听器听到ServletContext 对象创建时
--加载Spring 配置文件,把配置文件配置对象创建
--把创建出来的对象放到ServletContext 域对象中(setAttribute 方法)
--获取对象的时候,到ServletContext 域对象中得到(getAttribute 方法)
五、Spring 的Bean 管理(注解,推荐)
- 注解 1)代码里面特殊的标记,使用注解可以完成功能 2)注解写法 @注解名称(属性名称=属性) 3)可以使用在类/方法/属性上面
- Spring 的注解的使用
- 导入基本jar 包
- 导入Aop jar 包
- 创建类,创建方法
- 创建Spring 配置文件,引入约束
- 引入beans 之外还需要新的contexts 约束
- 在xml 添加需要扫描的包
- 使用注解创建对象
- 使用注解创建对象一共有四个:
- 创建对象单实例和多实例:
- 注解方式注入属性
- 创建service 类,创建dao 类,在service 类中注入dao对象,有@Autowired
- 在service 类里面定义dao 类型属性1)用@Autowired
2)用@Resource - 配置文件和注解混合使用
- 创建对象使用配置文件方式实现
- 注入属性使用注解方式实现
ps:
spring注解的作用:
1、spring作用在类上的注解有@Component、@Responsity、@Service以及@Controller;而@Autowired和@Resource是用来修饰字段、构造函数或者设置方法,并做注入的。
2、当注解作用在类上时,表明这些类是交给spring容器进行管理的,而当使用@Autowired和@Resource时,表明我需要某个属性、方法或字段,但是并不需要我自己去new一个,只需要使用注解, spring容器会自动的将我需要的属性、方法或对象创造出来。这就是通常所说的依赖注入和控制反转。
六、AOP
- AOP的概念:面向切面编程,扩展功能不是修改源代码实现。采取横向抽取机制,取代了传统的纵向机制(纵向继承重复性代码)
- 纵向机制(以前)
- 横向机制(现在) 1)有接口实现
2)没有接口实现 - 基本术语:
- JoinPoint 连接点:类里面哪些方法可以被增强,这些方法就是连接点
- Pointcut 切入点:在类里面有很多方法可以被增强,比如实际操作中,只增强了add()方法,那么add 方法就是切人点
- Advice 通知/增强:增强逻辑,称为增强,比如扩展日志功能,这个功能的逻辑就是增强:
- 前置通知:在add 方法之前
- 后置通知:在add 方法之后
- 异常通知:方法出现异常时增强
- 最终通知:方法之后的后置之后执行
- 环绕通知:计算方法时间,方法前后都执行
- Aspect 切面:把增强应用到具体的方法上,这个过程就叫切面
- Spring 的AOP 操作
- 在Spring 里面进行AOP 操作用的是AspectJ 实现
- AspectJ 不是Spring 的一部份和Spring 一起进行aop 操作
- Spring 2.0 以后新增了对AspectJ 支持
- 在Spring 里面进行AOP 操作用的是AspectJ 实现
- 使用AspectJ 实现AOP 的两种操作
-
- 操作基本准备,导入jar 包
- 创建Spring 核心配置文件,导入AOP 的约束
- 开发中需要引入的约束
- 操作基本准备,导入jar 包
- 基于AspectJ 的xml 配置方式
- 基于AspectJ 的注解方式
- 基于AspectJ 的xml 配置方式
七、Log4J 介绍
- 通过Log4J 可以看到程序运行过程中更详细的信息
- 导入Log4J jar 包
- 复制配置文件复制到src 中
- 最后一个log4j.rootLogger 1)info:可以看到基本信息 2)debug:可以看到更详细的信息
八、Spring 整合Web 项目演示
- action 调用service,service 调用dao
- 每次访问都加载配置文件,影响性能
- 解决方案:
- 在服务器启动时就创建加载配置文件
- 底层使用监听器,ServletContext 对象
- 在Spring 中不需要我们自己写代码实现
- 配置监听器前导入Spring 的web jar 包 spring_web_4.2.2_RELEASE.jar
- 封装了监听器,我们只需要配置监听器就可以了
- 在web.xml 用listener 配置监听器
- 指定需要加载的Spring 配置文件的位置
九、Spring 配置C3P0
- 配置c3p0 连接池
- 使用jdbcTemplate
- 利用dataSource注入
十、Spring 的事务api 介绍
- 事务的概念:1)什么时事务 2)事务的特性 ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability) 3)不考虑事务会产生读的什么问题?(幻读,脏读,不可重复读)--》设置隔离性,多个事务之间不会产生影响
- 事务管理:两种
- 编程式事务管理
- 声明式事务管理
- 基于xml 配置实现
- 基于注解方式
- Spring 进行事务管理的API:接口 PlatformTransactionManager 事务管理器
- Spring 针对不同的dao 框架提供不同的接口实现类
- 无论是配置文件还是注解都需要配置事务管理器,根据实现类创建对象
- 搭建转账来实现事务一致性,小王少1000,小李多1000
- 创建表,添加数据
- 创建service 和 dao 类,完成注入关系
- 解决事务不一致的问题,配置事务
- 配置事务管理器
- 配置事务增强
- 配置切面
- 配置事务管理器
- 使用注解解决事务问题
参考:
- Spring 配置事务的五种方式:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html
- Spring 框架IoC 容器和AOP 解析:https://www.cnblogs.com/xiaoxing/p/5836835.html