文章目录
Spring介绍
Spring一站式框架
正是因为Spring框架性质是属于容器性质的,容器中装什么对象就有什么功能,所以可以一站式
不仅不排斥其他框架,还能帮其他框架管理对象
- AOP支持
- IOC思想
- Spring JDBC
- AOP事务
- Junit测试支持
EE开发结构
- WEB层:Spring MVC
- 业务层/Service层:Bean管理:(IOC)
- 持久层/Dao:Spring的JDBC模板,ORM模板用于整合其他的持久层框架
Spring搭建
导包
- 基础包
- 日志包
- 可选包
创建对象
书写配置注册对象到容器
位置任意(建议放到src下)
配置文件名任意(建议applicationContext.xml)
- 导入约束
- 测试
Spring概念
IOC思想
IOC:Inverse Of Control 控制反转
将我们创建对象的方式反转了,将对象的创建权交给了Spring
以前对象的创建是由开发人员自己维护,包括依赖关系也是自己注入
使用了Spring之后,对象的创建以及依赖关系可以由Spring完成创建以及注入
反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序
DI思想
Dependency Injection 依赖注入
实现IOC思想需要DI做支持
依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入
DI为IOC提供了技术上的支持
注入方式:
- set方法注入
- 构造方法注入
- 字段注入
注入类型:
- 值类型注入 (8大基本数据类型,配置文件中配置)
- 引用类型注入 (将依赖对象注入)
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
BeanFactory&ApplicationContext
BeanFactory接口:Spring原始接口.针对原始接口的实现类功能较为单一
BeanFactory接口实现类对应的容器的特点:每次在获得对象时才会创建对象
ApplicationContext接口:每次容器启动时就会创建配置中的所有对象,提供更多功能
从类路径下加载配置文件:ClassPathXmlApplicationContext
从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext(“d:/xxx/yyy/xxx”)
结论:web开发中,使用applicationContext. 在资源匮乏的环境可以使用BeanFactory
Spring配置详解
-
Bean元素
-
Spring创建对象的方式
- 空参构造方式
- 静态工厂(了解)
- 实例工厂(了解)
- 空参构造方式
-
Bean元素进阶
-
scope属性
作用范围- singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例(容器启动时创建)
- prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的.(每次请求都会创建一个Action,ActionBean设成多例)
- request:web环境下.对象与request生命周期一致.(一次请求过后该对象就会从Spring中移除)
- session:web环境下,对象与session生命周期一致.(一次会话结束过后该对象就会从Spring中移除)
-
生命周期属性
- 配置一个方法作为生命周期初始化方法.spring会在对象创建之后立即调用.
- init-method
- 配置一个方法作为生命周期的销毁方法.spring容器在关闭并销毁所有容器中的对象之前调用.
- destroy-method
-
-
Spring分模块配置
Spring属性注入
注入方式
set方法注入
构造函数注入
p名称空间注入
spEL注入
复杂类型注入
-
数组
-
list
-
map
-
properties
在WEB环境中使用Spring容器
- 导包 4+2+1(spring-web)
- 在web.xml中配置listener => ContextLoaderListener
配置参数,指定spring配置路径
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定加载spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
- 在Action中,使用工具类获得容器.
WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
使用注解(代替XML)配置Spring
步骤
导包4+2+spring-aop
- 为主配置引入新的命名空间(约束)
- 开启使用注解代理配置文件
- 在类中使用注解完成配置
将对象注册到容器
修改对象的作用范围(单例,多例)
值类型注入
Field赋值直接访问了内部私有成员变量,破坏了封装性(将不希望外界看到的属性私有,值暴露出公有对外操作方法get/set)
引用类型注入
自动装配,合格者装配,手动注入
初始化/销毁方法
Spring与Junit整合测试
导包:4+2+aop+test
配置注解
Spring中的AOP
AOP思想:面向切面编程思想
纵向重复,横向抽取
应用:
页面提交请求servlet接受参数,解决参数乱码问题,将解决乱码的代码抽取放到Filter中
事务管理中,事务的开启和提交放入代理类InvocationHandler,使用代理技术动态加载到所有的service层(被代理对象)中,形成代理对象
Proxy.newProxyInstance(
classLoader,Interface[] arr , InvocationHandler
);
拦截器
Interceptors能覆盖到所有的Action,抽取出接受参数的功能放到拦截器
Spring实现AOP的原理
-
动态代理
被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术 -
cglib代理
第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.
AOP名词
Spring的AOP演示
导包:4+2+ +2+2
spring的AOP包
spring需要的第三方AOP包
- 准备目标对象
-
准备通知
-
配置进行织入,将通知织入目标对象中
导入AOP约束
注解配置进行织入(了解)
spring AOP开发
Spring AOP封装了动态代理代码,不需要手写动态代理代码
还封装了cglib代理,都可以对任何类进行代理增强
spring名词
需要增强的代码部分就是通知,在目标对象的方法中,可以被应用通知的方法就是连接点,需要或者已经被织入通知的方法就是切入点,织入后产生的就是代理对象
Spring整合JDBC
Spring中提供了一个可以控制数据库的对象,对象封装了JDBC技术
JDBCTemplate JDBC模板对象
与DBUtils中的QueryRunner非常相似
导包:4+2+
spring-test+
spring-aop+
junit4类库+
C3p0连接池+
JDBC驱动+
spring-jdbc+
spring-tx(事务包)
演示
Spring配置
进阶
JDBCDaoSupport
- 读取外部的Properties属性
Spring中AOP事务
Spring封装了事务管理代码
-
事务操作:
打开事务
提交事务
回滚事务 -
事务操作对象
因为在不同平台,操作事务的代码各不相同.spring提供了一个接口 -
PlatformTransactionManager 接口不同平台实现类:
DataSourceTransactionManager
HibernateTransitionmanager
注意:在spring的事务管理中.最为核心的对象就是TransactionManager对象 -
Spring管理事务的属性介绍
- 事务的隔离级别
- 1读未提交
- 2读已提交
- 4可重复读
- 8串行化
-
是否只读
true
false -
事务的传播行为
Spring管理事务方式
编码式
-
将核心事务管理器配置到spring容器
-
配置TransactionTemplate模板
-
将事务模板注入Service
-
在Service中调用模板
xml配置(aop)
-
导包:4+2+aop+aspect+aop联盟+weaving
-
导入新的约束
beans: 最基本
context:读取properties配置
aop:配置aop (织入)
tx:配置事务通知 -
配置通知
-
4.配置将通知织入目标
注解配置(aop)
- 导包和约束同上
- 使用注解,加类上或方法上