Java框架 第二部分 Spring


1 Spring概述

官网
Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。
Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。

Spring优点:

  1. 轻量
  2. 针对接口编程,解耦合
  3. 支持AOP编程
  4. 方便集成各

Spring体系结构
包含20多个模块

  • 数据访问/集成
  • Web
  • AOP、Aspects
  • JVM代理
  • 消息发送
  • 核心容器
  • 测试
    在这里插入图片描述

2 IoC 控制反转

控制反转,是一个概念,是一种思想。
指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。
当前比较流行的实现方式是依赖注入。

依赖注入:DI(Dependency Injection),程序代码不做定位查询,这些工作由容器自行完成。

Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称为 Bean。Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用“依赖注入”的方式来管理 Bean 之间的依赖关系。

2.1 基于XML的DI

set注入

set 注入也叫设值注入是指,通过 setter 方法传入被调用者的实例。这种注入方式简单、直观,因而在 Spring 的依赖注入中大量使用。
在这里插入图片描述
对于其它 Bean 对象的引用,使用< bean/>标签的 ref 属性
在这里插入图片描述

在这里插入图片描述

构造注入

构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即,使用构造器设置依赖关系。
在这里插入图片描述
在这里插入图片描述
对于引用类型属性的注入,也可不在配置文件中显示的注入。

  • byName 根据名称自动注入( 对id 进行比较)
  • byType 根据类型自动注入(对类进行比较)

随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件变得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring 配置文件分解成多个配置文件。

在这里插入图片描述

2.2 基于注解的DI

在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。

在这里插入图片描述

@Component

在类上使用注解@Component,该注解的 value 属性用于指定该 bean 的 id 值。
在这里插入图片描述

@Value

在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
在这里插入图片描述

byType 自动注入@Autowired

在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配 Bean 的方式
在这里插入图片描述

byName 自动注入@Autowired与@Qualified

在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。

在这里插入图片描述

@Resource

Spring提供了对 jdk中@Resource注解的支持。@Resource 注解既可以按名称匹配Bean,也可以按类型匹配 Bean。
默认是按名称注入

2.3 注解与XML的对比

注解优点:方便、直观、高效
注解弊端:以硬编码的方式写入到 Java 代码中,修改时需要重新编译代码

XML优点:配置和代码是分离的、在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
XML缺点:编写麻烦,效率低,大型项目过于复杂。

3 AOP 面向切面编程

面向切面编程,就是将交叉业务逻辑封装成切面,利用 AOP 容器的功能将切面织入到主业务逻辑中。
所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志、缓存等。

利用 AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

AOP 底层,就是采用动态代理模式实现的。
采用了两种代理:JDK 的动态代理,与 CGLIB的动态代理。

AOP好处:
1.减少重复
2.专注业务

3.1 AOP编程术语

1)切面(Aspect)
2)连接点(JoinPoint)
3)切入点(Pointcut)
4)目标对象(Target)
5)通知(Advice)

3.2 AspectJ对AOP的实现

官网

通知类型:

  • 前置
  • 后置
  • 环绕
  • 异常
  • 最终

切入点表达式:execution(访问权限 方法返回值 方法声明(参数) 异常类型)

execution(modifiers-pattern? ret-type-pattern 
	declaring-type-pattern?name-pattern(param-pattern)
 	throws-pattern?)

基于注解的AOP实现
实现步骤:

  • 定义业务接口和实现类
  • 定义切面类
    在这里插入图片描述
  • 声明目标对象和切面类对象
    在这里插入图片描述
  • 使用AspectJ的自动代理
    在这里插入图片描述
  • 测试类中使用目标对象的 id

4 Spring 集成MyBatis

将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring来管理。所以,该整合,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。

实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理

  • MySQL创建数据库springdb,新建表Student
  • 配置maven依赖 pom.xml
  • 定义实体类 Student
  • 定义 StudentDao 接口
  • 定义映射文件 mapper
  • 定义 Service 接口和实现类
  • 定义 MyBatis 主配置文件
  • 修改 Spring 配置文件(Druid数据库连接池)
  • 向 Service 注入接口名

5 Spring 事务

事务原本是数据库中的概念,在 Dao 层。但一般情况下,需要将事务提升到业务层,即 Service 层。
这样做是为了能够使用事务的特性来管理具体的业务。

在 Spring 中通常可以通过以下两种方式来实现对事务的管理:
(1)使用 Spring 的事务注解管理事务
(2)使用 AspectJ 的 AOP 配置管理事务

五个事务隔离级别、七个书屋传播行为常量、默认事务超时时限

5.1 使用 Spring 的事务注解管理事务

通过@Transactional 注解方式,可将事务织入到相应 public 方法中,实现事务管理。

  • 声明事务管理器
    在这里插入图片描述

  • 开启注解驱动
    在这里插入图片描述

  • 业务层 public 方法加入事务属性
    在这里插入图片描述

5.2 使用 AspectJ 的 AOP 配置管理事务

使用 XML 配置事务代理的方式的不足是,每个目标类都需要配置事务代理。当目标类较多,配置文件会变得非常臃肿。

使用 XML 配置顾问方式可以自动为每个符合切入点表达式的类生成事务代理。其用法很简单,只需将前面代码中关于事务代理的配置删除,再替换为如下内容即可。

  • 修改maven 依赖 pom.xml
  • 在容器中添加事务管理器
  • 配置事务通知(用于指定要将事务以什么方式织入给哪些方法)
  • 配置增强器
  • 修改测试类

6 Spring与Web

6.1 Web项目使用Spring

在 Web 项目中使用 Spring 框架,首先要解决在 web 层(这里指 Servlet)中获取到 Spring容器的问题。
只要在 web 层获取到了 Spring 容器,便可从容器中获取到 Service 对象。

  • 新建一个 Maven Project
  • Service 层、Dao 层全部代码
    配置文件 applicationContext.xml 及 jdbc.properties,mybatis.xml
    pom.xml
    加入 servlet ,jsp 依赖
  • 定义 index 页面
  • 定义 RegisterServlet
  • 定义 success 页面
  • web.xml 注册 Servlet

将 Spring 容器的创建放在 Servlet 进行初始化时进行,即执行 init()方法时执行。并且,Servlet 还是单例多线程的,即一个业务只有一个 Servlet 实例,所有执行该业务的用户执行的都是这一个 Servlet 实例。这样,Spring 容器就具有了唯一性了。

但是,Servlet 是一个业务一个 Servlet 实例,即 LoginServlet 只有一个,但还会有StudentServlet、TeacherServlet 等。每个业务都会有一个 Servlet,都会执行自己的 init()方法,也就都会创建一个 Spring 容器了。这样一来,Spring 容器就又不唯一了。

6.2 使用Spring的的监听器 ContextLoaderListener

对于 Web 应用来说,ServletContext 对象是唯一的,一个 Web 应用,只有一个ServletContext 对象,该对象是在 Web 应用装载时初始化的。若将 Spring 容器的创建时机,放在 ServletContext 初始化时,就可以保证 Spring 容器的创建只会执行一次,也就保证了Spring 容器在整个应用中的唯一性。

  • maven 依赖 pom.xml(spring-web-5.2.5.RELEASE 相关工作的封装)
  • 注册监听器 ContextLoaderListener
  • 指定 Spring 配置文件的位置< context-param>
  • 获取 Spring 容器对象(从 ServletContext 中获取或者通过 WebApplicationContextUtils 获取)

传送门

上一章:Java框架 第一部分 MyBatis
下一章:

猜你喜欢

转载自blog.csdn.net/RTyinying/article/details/115182506
今日推荐