Spring是什么?
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。
Spring优势
方便解耦,简化开发(IOC容器)
AOP 编程的支持
声明式事务的支持
方便程序的测试
方便集成各种优秀框架
降低 JavaEE API 的使用难度
Java 源码是经典学习范例
Spring体系结构
Spring使用配置文件开发
Spring开发步骤
导入 Spring 开发的基本包坐标
编写 Dao 接口和实现类
创建 Spring 核心配置文件(applicationContext.xml)
在 Spring 配置文件中配置 UserDaoImpl
使用 Spring 的 API 获得 Bean 实例
Spring配置文件
Bean标签基本配置
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
Bean标签范围配置
scope:指对象的作用范围
singleton:默认值,单例的。
prototype:多例的。
request:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中。
session:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中。
global session:WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当 于 session。
singleton
prototype
Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
Bean实例化三种方式
使用无参构造方法实例化
工厂静态方法实例化
工厂实例方法实例化
工厂实例方法实例化(优化)

Bean的依赖注入入门
创建 UserService,UserService 内部在调用 UserDao的save() 方法
将 UserServiceImpl 的创建权交给 Spring
从 Spring 容器中获得 UserService 进行操作
Bean的依赖注入方式
set方法注入
引用数据类型
在UserServiceImpl中添加setUserDao方法
配置Spring容器调用set方法进行注入
基本数据类型
在UserServiceImpl中添加setUserDao方法
配置Spring容器调用set方法进行注入
集合类型
List<String>
List<User>
Map<String,User>
Properties
构造方法注入
引用数据类型
创建有参构造
配置Spring容器调用有参构造时进行注入
基本数据类型
创建有参构造
配置Spring容器调用有参构造时进行注入
加载properties文件
开启context命名空间
使用context命名空间,加载制定的properties文件
使用${}读取加载的属性值
Spring注解开发
Spring注解开发
Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置 文件可以简化配置,提高开发效率。
使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。
使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化
使用@Autowired(按类型自动装配)或者@Autowired+@Qulifier或者@Resource(按名称装配)进行userDao的注入
使用@Value进行字符串的注入
使用@Scope标注Bean的范围
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
Spring配置类注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
@Configuration
@ComponentScan
@Import
@PropertySource
@value(基本数据类型用@value,引用数据类型用形参)
@Bean(实现第三方数据注入用的)
Spring配置数据源
数据源(连接池)的作用
数据源(连接池)是提高程序性能如出现的
事先实例化数据源,初始化部分连接资源
使用连接资源时从数据源中获取
使用完毕后将连接资源归还给数据源
常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid等
数据源的开发步骤
导入数据源的坐标和数据库驱动坐标
导入jdbc.properties文件
创建数据源对象并设置数据源的基本连接数据
使用数据源获取连接资源和归还连接资源
案例(druid)
导入数据源的坐标和数据库驱动坐标
导入jdbc.properties文件
创建数据源对象并设置数据源的基本连接数据
Spring集成Junit
Spring集成Junit代码实现
导入spring集成Junit的坐标
使用@Runwith注解替换原来的运行期
使用@ContextConfiguration指定配置文件或配置类
使用@Autowired注入需要测试的对象
创建测试方法进行测试
SpringAOP
面向切面编程,可以在不惊动原始设计的基础上为其进行功能增强
核心概念
连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等(在SpringA0P中,理解为方法的执行)
切入点(Pointcut):匹配连接点的式子
在SpringAoP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
一个具体方法:com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法
匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
通知(Advice):在切入点处执行的操作,也就是共性功能
在SpringAoP中,功能最终以方法的形式呈现
通知类:定义通知的类
切面(Aspect):描述通知与切入点的对应关系
实现步骤
导入坐标(pom.xml)
制作连接点方法(原始操作,Dao接口与实现类)
制作共性功能(通知类与通知)
定义切入点(必须是私有方法)
绑定切入点与通知关系(切面 )
Aop切入点表达式
切入点表达式格式
切入点表达式通配符
说明:
这里eat,bark,meow方法都符合切入点表达式
Aop通知类型
@Before(前置通知)
@After(后置通知)
@Around(环绕通知(重点))
@AfterReturning(返回后通知)
@AfterThrowing(抛出异常后通知)
@Around注意事项
环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知
通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行
对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Obiect类型
原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object
由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象
Aop通知获取数据
获取参数
JoinPoint:适用于前置、后置、返回后、抛出异常后通知(形参如果有两个JoinPoint必须放在第一个)
ProceedJointPoint:适用于环绕通知
获取返回值
返回后通知(@AfterReturning中的returning参数名称必须和形参相同)
环绕通知
获取异常
抛出异常后通知(@AfterThrowing中的throwing参数名称必须和形参相同)
环绕通知
Spring事务
事务作用:在数据层保障一系列的数据库操作同成功同失败
Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
实现步骤
在业务层接口上添加Spring事务管理
设置事务管理器(在JdbcSpring中)
开启注释事务驱动
Spring事务角色
事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法