day01-下载,概述.监听器
Spring4学习路线
第一天:Spring的概述,SpringIOC入门(XML),Spring的Bean管理,Spring属性注入
第二天:Spring的IOC的注解方式,Spring的AOP开发(XML)
第三天:Spring的AOP的注解开发,Spring的声明式事务,jdbcTemplate
第四天:SSH的整合,HibernateTemplate的使用,OpenSessionInViewFilter的使用
Spring的概述
什么是Spring?
Spring叫做EE开发的一站式框架。
一站式框架:有EE开发的每一层解决方案。
WEB层:SpringMVC
Service:Spring的Bean管理,Spring声明式事务
DAO层:Spring的jdbc模板,Spring的ORM模板
Spring优点:
方便解耦合:IOC
AOP的开发:对程序进行扩展
轻量级框架
方便与其他框架整合
Spring的版本
Spring3.x和Spring4.x
Spring的入门(IOC)
1.什么是IOC?
控制反转(Inversion of Control)
控制反转:将对象的创建权反转给(交给)Spring。
2.下载Spring的开发包
官网:http://spring.io/
3.解压Spring的开发包
docs:Spring的开发规范和API
libs:Spring的开发的jar和源码
schema:Spring的配置文件的约束
4.创建web项目,引入jar包 (4个基本jar包和2个日志jar包)
5.创建接口和类
问题:
如果底层的实现切换了,需要修改源代码,能不能不修改程序源代码对程序进行扩展?
6.将接口和实现类交给Spring管理
在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html(获取约束)
7.编写测试类
IOC和DI
IOC:控制反转,将对象的创建权反转给了spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
<!--Spring的入门的配置--> <bean id="userDAO" class="com.itheima.spring.demo1.UserDAOImpl"> <property name="name" value="张三"/> </bean>
面向对象的时候
依赖:
Class A{
}
Class B{
public void xxx(A a){}
}
继承:is a
聚合:has a
Spring的工厂类
ApplicationContext继承了BeanFactory
1.BeanFactory:老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例。
2.ApplicationContext:新版本的工厂类
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
ApplicationContext有两个实现类:
ClassPathXmlApplicationContext:加载类路径下(src下)的配置文件
FileSystemXmlApplicationContext:加载文件系统下的配置文件(本地磁盘)
XML的本地提示的配置
Bean的相关的配置
1.<bean> 标签的id和name的配置
id:使用了约束中的唯一约束。里面不能出现特殊字符的。
name:没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现)。里面可以出现特殊字符。
2.Bean的生命周期的配置(了解)
init-method:Bean被初始化的时候执行的方法
destroy-method:Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭。否则多例的话不知道具体要销毁哪一个对象)
3.Bean的作用范围的配置(重点)
scope:Bean的作用范围
singleton:默认的,Spring会采用单例模式创建这个对象。(单例:不管有多少程序调用,它只会被new一次,每次new的都是同一个对象的实例)
prototype:多例模式。(用一次就new一个)(Struts2和Spring整合的时候一定会用到)
request:应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中
session:应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中
globalsession:应用在web项目中,必须在porlet环境下使用(porlet环境指的是在一个地方存入数据以后,在它的子系统就不需要登录了,如qq登录后跳转至qq空间无需重新登录)。但是如果没有这种环境,相当于session。
Spring的Bean的实例化方式(了解)
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
1.无参构造方式的方式(默认)
public class Bean1{ public Bean1(){
super();
System.out.println("Bean1的无参的构造方法执行了。。。");
} }
编写配置:
<!--无参数构造方法--> <bean id="bean1" class="com.itheima.spring.demo3.Bean1"></bean>
2.静态工厂实例化的方式
编写Bean2的静态工厂
public class Bean2Factory{
public static Bean2 createBean2(){
System.out.println("Bean2Factory中方法执行了。。。");
return new Bean2();
} }
配置
<!--静态工厂实例化--> <bean id="bean2" class="com.itheima.spring.demo3.Bean2Factory" factory-method="createBean2">
3.实例工厂实例化的方式
Bean3的实例工厂
public class Bean3Factory{
public Bean3 createBean3(){
System.out.printlin("Bean3的实例工厂执行了。。。");
return new Bean3();
} }
配置
<!--实例工厂实例化--> <bean id="bean3Factory" class="com.itheima.spring.demo3.Bean3Factory"></bean> <bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"></bean>
Spring的属性注入(Spring2.5以后版本)
1. 构造方法的方式的属性注入
2.set方法的方式的属性注入
Set方法设置对象类型的属性
3.P名称空间的属性注入
通过引入p名称空间完成属性的注入:
写法:
普通属性 p:属性名="值"
对象属性 p:属性名-ref="值"
p名称空间的引入:
使用p名称空间 :
SpEL的属性注入(Spring3.0以后版本)
SpEL:Spring Expression Language,Spring的表达式语言。
语法:
#{SpEL }
复杂(集合)类型的属性注入(如:数组、List、Set、Map、Properties)
Spring的分模块开发的配置(将Spring的配置文件分成多个 )
1.在加载配置文件的时候,加载多个
2.在一个配置文件中引入多个配置文件
CRM的综合案例(客户保存)
一.搭建开发环境
1.创建数据库和表
2.创建web项目,引入jar包
引入struts2的开发的jar包
引入struts2的配置文件
web.xml(核心过滤器)
struts.xml
3.引入页面
4.编写Action
5.配置Action
6.修改页面提交到Action
7.编写Action的save方法
不在Action中直接创建Service,将Service交给Spring管理。
创建Service接口和实现类
8.引入Spring的环境
引入jar包
引入配置文件
9.将Service交给Spring管理
10.在Action中调用Service
11.编写DAO并且完成配置
编写DAO的接口和实现类
将DAO交给Spring管理
12.在Service中使用DAO
说明: 这个项目缺失了,包括hibernate的配置及整合spring的部分、监听器的部分也没有
Spring的整合web项目
演示Spring和web项目中的一些问题:
每次请求都会创建Spring的工厂,浪费服务器资源。
解决:
在服务器启动的时候创建Spring的工厂
将工厂保存到ServletContext中
每次获取工厂的时候从ServletContext中获取
整合web项目
引入spring_web.jar
配置ContextLoaderListener
默认加载的是/WEB-INF/applicationContext.xml
配置修改加载配置文件的路径
通过工具类获取工厂
day02-注解IOC
Spring的IOC的注解开发
Spring的IOC的注解开发的入门
1.创建web项目,引入jar包
在Spring4的版本中,除了引入基本的开发包以外,还需要引入aop的包。
2.引入Spring的配置文件
在src下创建applicationContext.xml
引入约束:使用注解开发引入context约束。
约束:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
3.创建接口和实现类
4.开启Spring的组件扫描
5.在类上添加注解
6.编写测试类
7.注解方式设置属性的值
注解方式:使用注解方式,可以没有set方法。
属性如果有set方法,需要将属性注入的注解添加到set方法。
属性如果没有set方法,需要将属性注入的注解添加到属性上。
Spring的IOC的注解的详解
1.@Component:组件
修饰一个类,将这个类交给Spring管理。(前提:xml文件要配置组件扫描)
这个注解有三个衍生注解(功能类似),修饰类。
@Controller:web层
@Service:service层
@Repository :dao层
2.属性注入的注解
普通属性:
@Value:设置普通属性的值
对象类型属性:
@Autowired:设置对象类型的属性的值,但是按照类型完成属性注入。
我们习惯是按照名称完成属性注入:必须让@Autowired注解和@Qualifier注解(@Qualifier(value="userDao"),这里设置的值需要和@Repository("userDao")注解设置的值保持一致)一起使用完成按照名称属性注入。
@Resource:完成对象类型的属性的注入,按照名称完成属性注入。(@Resource(name="userDao"))
Bean的其他的注解
生命周期相关的注解(了解)
@PostConstruct:初始化方法
@PreDestroy:销毁方法
Bean作用范围的注解
@Scope:作用范围
singleton:默认单例
prototype:多例
request
session
globalsession
IOC的XML和注解开发比较
适用场景:
XML:可以适用任何场景。
结构清晰,维护方便。
注解:有些地方用不了,这个类不是自己提供的。
开发方便。
XML和注解整合开发
XML管理Bean,注解完成属性注入。
说明:只有属性使用注解的方式,无需写扫描,只需要写下面的代码配置即可。另外,如果是属性注入,也无需写set方法。
Spring的AOP的XML开发
AOP的概述
什么是AOP
AOP:面向切面编程。AOP是OOP的扩展和延伸,解决OOP开发遇到的问题。
AOP的应用场景
Spring底层的AOP实现原理
动态代理
JDK动态代理:只能对实现了接口的类产生代理。
Cglib动态代理(类似于Javassist第三方代理技术):对没有实现接口的类产生代理对象,生成子类对象。
Spring的AOP底层实现(了解)
1.JDK动态代理
2.Cglib动态代理
Cglib:第三方开源代码生成类库,动态添加类的属性和方法。
Spring的AOP的开发(AspectJ的XML的方式)
Spring的AOP的简介
AOP思想最早是由AOP联盟组织提出的。Spring使用这种思想最好的框架。
Spring的AOP有自己实现的方式(非常繁琐)。AspectJ是一个AOP的框架,Spring引入AspectJ作为自身AOP的开发。
Spring两套AOP开发方式
Spring传统方式(弃用)
Spring基于AspectJ的AOP的开发(使用)
AOP开发中相关术语
Spring的AOP的入门(AspectJ的XML的方式)
1.创建web项目,引入jar包
引入基本开发包
引入aop开发的相关jar包
2.引入Spring的配置文件
引入aop的约束(记得配置提示)
3.编写目标类并完成配置
4.编写测试类
Spring整合Junit单元测试 (不需要重复定义工厂了)
先引入一个jar包(spring-test-4.2.4.RELEASE.jar)
5.编写一个切面类
将切面类交给Spring
6.通过AOP的配置实现
Spring中通知类型
1.前置通知:在目标方法执行之前进行操作(权限管理)
前置通知:获得切入点信息
2.后置通知:在目标方法执行之后进行操作(日志记录)
后置通知:获得方法的返回值
说明:returning配置的值可以随便写,但是要求和切面类中的方法参数的名称保持一致。
3.环绕通知:在目标方法执行之前和之后进行操作(性能监控)
环绕通知:可以阻止目标方法的执行
4.异常抛出通知:在程序出现异常的时候,进行的操作(事务管理)
throwing后面的值表示异常抛出的信息,随便命名,只要和切面类中调用方法的参数保持一致即可。
5.最终通知:无论代码是否有异常,总是会执行(相当于finally代码块中内容)。
6.引介通知(不用会)
Spring的切入点表达式写法
切入点表达式语法:
基于execution的函数完成的
语法
[访问修饰符] 方法返回值 包名.类名.方法名(参数)
public void com.itheima.spring.CustomerDao.save(..)
* void com.itheima.spring.CustomerDao+.save(..) :+表示当前类及其子类的save方法都可以被增强,*表示返回值是任意类型,..表示任意参数
day03-事务&JDBC模板
Spring的AOP的基于AspectJ注解开发
1.创建项目,引入jar包
2.引入配置文件
3.编写目标类并配置
4.编写切面类并配置
5.使用注解的AOP对目标类进行增强
在配置文件中打开注解的AOP开发
在切面类上使用注解
@Aspect:定义切面
6.编写测试类
Spring的注解的AOP的通知类型
1.@Before:前置通知
2.@AfterReturning:后置通知
3.@Around:环绕通知
4.@AfterThrowing:异常抛出通知
5.@After:最终通知
Spring的AOP的注解的切入点的注解
说明:如果目标对象实现了接口,spring底层会自动使用jdk动态代理,未实现接口,底层会自动使用Cglib动态代理。
Spring的JDBC的模板的使用
Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。Spring对持久层也提供了解决方案:ORM模块和JDBC的模块。
Spring提供了很多的模版用于简化开发。
JDBC模版使用的入门
1.创建项目,引入jar包
引入基本的开发包
数据库驱动
Spring的JDBC模版的jar包
2.创建数据库和表
3.使用JDBC的模版:保存数据
将连接池和模版交给Spring管理
1.引入Spring的配置文件
2.使用JDBC的模版
引入spring_aop的jar包
使用开源的数据库连接池
DBCP的使用:database connection pool
引入jar包
配置DBCP连接池
C3P0的使用
引入c3p0连接池jar包
配置C3P0连接池
抽取配置到属性文件
1.定义一个属性文件
2.在Spring的配置文件中引入属性文件
第一种
第二种
3.引入属性文件的值
4.测试
补充小技巧:STS插件(国外网站在线下载和安装,特别慢):可以在写类名的时候给出全类路径
使用JDBC模版完成CRUD的操作(说明:增删改是一样的,都是使用update)
1.保存操作
2.修改操作
3.删除操作
4.查询操作
查询某个属性
查询返回对象或集合
数据封装
Spring的事务管理
事务的回顾
什么是事务?
事务:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
事务的特性?
原子性:事务不可分割
一致性:事务执行前后数据完整性保存一致
隔离性:一个事务的执行不应该受到其他事务的干扰
持久性:一旦事务结束,数据就持久化到数据库
如果不考虑隔离性引发安全性问题?
读问题
脏数据:一个事务读到另一个事务未提交的数据
不可重复读:一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
虚读、幻读:一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致
写问题
丢失更新
解决读问题?
设置事务的隔离级别
Read uncommitted:未提交读,任何读问题解决不了
read committed:已提交读,解决脏读,但是不可重复读和虚读有肯能发生(oracle)
repeatable read:重复读,解决脏读和不可重复读,但是虚读有可能发生(mysql)
serializable:解决所有读问题
Spring的事务管理的API
PlatformTransactionManager:平台事务管理器
平台事务管理器:接口,是spring用于管理事务的真正的对象。
DataSourceTransactionManager:底层使用JDBC管理事务
HibernateTransactionManager:底层使用Hibernate管理事务
TransactionDefinition:事务定义信息
事务定义:接口,用于定义事务的相关的信息,如:隔离级别,超时信息,传播行为,是否只读
TransactionStatus:事务的状态
事务状态:用于记录在事务管理过程中,事务的状态的对象。
事务管理的API的关系
Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。
Sping的事务的传播行为
Sping中提供了七种事务传播行为(解决问题:解决复杂业务的相互调用问题)
保证多个操作在同一个事务中
PROPAGATION_REQUIRED:默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
PROPAGATION_SUPPORTS:支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
PROPAGATION_MANDATORY:如果A中有事务,使用A中的事务,如果A没有事务,抛出异常。
保证多个操作不在同一个事务中
PROPAGATION_REQUIRES_NEW:如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身的操作。如果A中没有事务,创建一个新事务,包含自身操作。
PROPAGATION_NOT_SUPPORTED:如果A中有事务,将A的事务挂起,不使用事务管理。
PROPAGATION_NEVER:如果A中有事务,报异常。
嵌套式事务
PROPAGATION_NESTED:嵌套事务,如果A中有事务,按照A的事务执行。执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过。如果有异常,可以选择回滚到保存点。
Spring的事务管理
1.搭建Spring的事务管理的环境
创建Service的接口和实现类
创建DAO的接口和实现类
配置Service和DAO:交给Spring管理
在DAO中编写扣钱和加钱的方法:
配置连接池和JDBC的模板
在DAO中注入jdbc的模板:
继承JdbcDaoSupport,就不需要在xml文件中编写jdbc模版托管给bean管理的配置,直接注入datasource即可。因为类JdbcDaoSupport中有创建模版的方法,会自动创建。
Spring的事务管理:一类:编程式事务(需要手动编写代码)--了解
1.第一步:配置平台事务管理器
2.第二步:Spring提供了事务管理的模板类
配置事务的管理的模板类
3.第三步:在业务层注入事务管理的模版
4.编写事务管理的代码
Spring的事务管理:二类:声明式事务管理(通过配置实现)--AOP
1.XML方式的声明式事务管理
第一步:引入aop的开发包
第二步:恢复转账环境
第三步:配置事务管理器
第四步:配置增强
第五步:AOP的配置
2.注解方式的声明式事务管理
第一步:引入aop的开发包
第二步:恢复转账环境
第三步:配置事务管理器
第四步:开启注解事务
第五步:在业务层添加注解
day04-SSH整合
SSH整合方式一:无障碍整合
SSH的回顾
SSH整合
1.第一步:创建WEB项目,引入jar包
Struts2的jar包
struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.jar
Struts2中有一些包需要了解的:
struts2-convention-plugin-2.3.24.jar ---Struts2的注解开发包
struts2-json-plugin-2.3.24.jar ---Struts2的整合AJAX的开发包
struts2-spring-plugin-2.3.24.jar ---Struts2的整合Spring的开发包
Hibernate的jar包
Hibernate的开发的必须的包
hibernate-release-5.0.7.Final\lib\required\*.jar
MySQL驱动
日志记录
⚠️注意:Struts2和Hibernate都引入了一个相同的jar包(javassist包)。删除一个版本低的
使用C3P0连接池:
Spring的jar包
IOC的开发
AOP的开发
JDBC模板的开发
事务管理
整合web项目的开发
整合单元测试的开发
整合hibernate的开发
2.第二步:引入配置文件
Struts的配置文件
web.xml
struts.xml
Hibernate的配置文件
hibernate.cfg.xml
映射文件(hibernate.hbm.xml)
日志文件
Spring的配置文件
web.xml
applicationContext.xml
日志记录
log4j.properties
3.第三步:创建包结构
4.第四步:创建相关的类
5.第五步:引入相关页面
6.第六步:修改add.jsp
7.第七步:Spring整合Struts2,方式一:Action由Struts2自身创建的
编写Action
配置Action
在Struts.xml中配置
在Action中引入Service
传统方式
进行Spring和Struts2的整合:
引入struts-spring-plugin.jar
在插件包中有如下配置
开启一个常量:在Struts2中只要开启这个常量,就会引发下面常量生效:
让Action按照名称自动注入Service:
将Service交给Spring管理
Action注入Service
8.第八步:Spring整合Struts2方式二:Action交给Spring管理(推荐)
引入插件包
引入struts-spring-plugin.jar
将Action交给Spring
在struts.xml中配置Action
⚠️注意:
需要配置Action为多例的:
需要手动注入Service
9.第九步:Service调用DAO
将DAO交给Spring管理
在Service注入DAO
10.第十步:Spring整合Hibernate框架
创建数据库和表
编写实体和映射
Spring和Hibernate整合
在Spring的配置文件中,引入Hibernate的配置信息
在Spring和Hibernate整合后,Spring提供了一个Hibernate的模版类简化Hibernate开发
改写DAO继承HibernateDaoSupport
配置的时候在DAO中直接注入SessionFactory
在DAO中使用Hibernate的模版完成保存操作
11.第十一步:配置Spring的事务管理
配置事务管理器
开启注解事务
在业务层使用注解
SSH整合方式二:将hibernate的配置交给Spring管理
SSH整合方式二:不带hibernate配置文件(hibernate.cfg.xml)
1.复制一个项目(注意:复制web项目后,需要修改项目属性下的项目名称)
2.hibernate配置文件中有哪些内容
数据库连接的配置
hibernate的相关的属性的配置
方言
显示SQL
格式化SQL
C3P0连接池
映射文件
3.将Hibernate的配置交给Spring