Spring

Spring是什么? Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。 Spring优势 方便解耦,简化开发(I

Spring是什么?

Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。

Spring优势

  • 方便解耦,简化开发(IOC容器)

  • AOP 编程的支持

  • 声明式事务的支持

  • 方便程序的测试

  • 方便集成各种优秀框架

  • 降低 JavaEE API 的使用难度

  • Java 源码是经典学习范例

Spring体系结构

Spring使用配置文件开发

Spring开发步骤

  1. 导入 Spring 开发的基本包坐标

  2. 编写 Dao 接口和实现类

  3. 创建 Spring 核心配置文件(applicationContext.xml)

  4. 在 Spring 配置文件中配置 UserDaoImpl

  5. 使用 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的依赖注入入门

  1. 创建 UserService,UserService 内部在调用 UserDao的save() 方法

  2. 将 UserServiceImpl 的创建权交给 Spring

  3. 从 Spring 容器中获得 UserService 进行操作

Bean的依赖注入方式

set方法注入

引用数据类型
  1. 在UserServiceImpl中添加setUserDao方法

  2. 配置Spring容器调用set方法进行注入

基本数据类型
  1. 在UserServiceImpl中添加setUserDao方法

  2. 配置Spring容器调用set方法进行注入

集合类型
  1. List<String>

  2. List<User>

  3. Map<String,User>

  4. Properties

构造方法注入

引用数据类型
  1. 创建有参构造

  2. 配置Spring容器调用有参构造时进行注入

基本数据类型
  1. 创建有参构造

  2. 配置Spring容器调用有参构造时进行注入

加载properties文件

  1. 开启context命名空间

  2. 使用context命名空间,加载制定的properties文件

  3. 使用${}读取加载的属性值

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等

数据源的开发步骤

  1. 导入数据源的坐标和数据库驱动坐标

  2. 导入jdbc.properties文件

  3. 创建数据源对象并设置数据源的基本连接数据

  4. 使用数据源获取连接资源和归还连接资源

案例(druid)

  1. 导入数据源的坐标和数据库驱动坐标

  2. 导入jdbc.properties文件

  3. 创建数据源对象并设置数据源的基本连接数据

Spring集成Junit

Spring集成Junit代码实现

  1. 导入spring集成Junit的坐标

  2. 使用@Runwith注解替换原来的运行期

  3. 使用@ContextConfiguration指定配置文件或配置类

  4. 使用@Autowired注入需要测试的对象

  5. 创建测试方法进行测试

SpringAOP

面向切面编程,可以在不惊动原始设计的基础上为其进行功能增强

核心概念

  • 连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等(在SpringA0P中,理解为方法的执行)

  • 切入点(Pointcut):匹配连接点的式子

  1. 在SpringAoP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

  2. 一个具体方法:com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法

  3. 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法

  • 通知(Advice):在切入点处执行的操作,也就是共性功能

  1. 在SpringAoP中,功能最终以方法的形式呈现

  • 通知类:定义通知的类

  • 切面(Aspect):描述通知与切入点的对应关系

实现步骤

  1. 导入坐标(pom.xml)

  2. 制作连接点方法(原始操作,Dao接口与实现类)

  3. 制作共性功能(通知类与通知)

  4. 定义切入点(必须是私有方法

  5. 绑定切入点与通知关系(切面 )

Aop切入点表达式

切入点表达式格式

切入点表达式通配符

说明:

这里eat,bark,meow方法都符合切入点表达式

Aop通知类型

@Before(前置通知)

@After(后置通知)

@Around(环绕通知(重点))

@AfterReturning(返回后通知)

@AfterThrowing(抛出异常后通知)

@Around注意事项

  1. 环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

  2. 通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行

  3. 对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Obiect类型

  4. 原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object

  5. 由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象

Aop通知获取数据

获取参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知(形参如果有两个JoinPoint必须放在第一个
ProceedJointPoint:适用于环绕通知

获取返回值

返回后通知(@AfterReturning中的returning参数名称必须和形参相同
环绕通知

获取异常

抛出异常后通知(@AfterThrowing中的throwing参数名称必须和形参相同
环绕通知

Spring事务

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败

  • Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败

实现步骤

  1. 在业务层接口上添加Spring事务管理

  2. 设置事务管理器(在JdbcSpring中)

  3. 开启注释事务驱动

Spring事务角色

  • 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法

  • 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

Spring事务属性

Spring事务传播行为

LICENSED UNDER CC BY-NC-SA 4.0
Comment