Spring笔记01

Spring笔记01 Spring快速上手+IOC+注解

01. Spring共四天

  • 第一天:spring框架的概述和spring中基于XML的IOC配置
  • 第二天:基于注解的IOC和IOC的案例
  • 第三天:spring中的aop和基于XML和注解的AOP配置
  • 第四天;spring中的JDBCTemlate以及Spring事务控制

02.今天课程内容概述

  1. spring的概述
    1. spring是什么
    2. spring的两大核心
    3. spring的发展经历和优势
    4. spring的体系结构
  2. 程序的耦合以及解耦
  3. IOC概念和spring中的IOC
    1. spring中基于XML的IOC环境搭建
  4. 依赖注入(Dependency Injection)
  5. 作业

03.Spring概述

  • Spring是分层的Java SE/EE的应用 full-stack轻量级开源框架,以IoC(inverse Of Control)AOP(Aspect Oriented Programming:面向切面编程) 为内涵,提供了展现层SpringMVC和持久层Spring JDBC以及业务层事物管理等众多的企业级应用技术.

04.Spring的发展历程

  • Rod Johnaon(spring之父)
  • 2017-9发布了spring的最新版spring5.0通用版

05.Spring的优势

  • 方便解耦,简化开发
  • AOP编程的支持
  • 声明式事物的支持
  • 方便程序的测试
  • 方便集成各种优秀框架
  • 降低JavaEE API的使用难度
  • Java源码是经典学习范例

06.Spring的体系结构

  • 源码结构
    • docs 文档
    • libs jar包
    • schema 约束
  • Core Container:核心容器,必须存在

07.编写jdbc的工程代码用于分析程序的耦合

  • jdbc
    1. 注册驱动
    2. 获取连接
    3. 获取操作数据库的预处理对象
    4. 执行SQL,得到结果集
    5. 遍历结果集
    6. 释放资源

08.编译期依赖

  • 如果一个类中需要使用一个jar包,没有的话编译期就会失败,这就可以理解为程序的耦合

09.程序的耦合和解耦的思路分析

  • 耦合:程序之间的依赖关系
    • 类之间的依赖
    • 方法间的依赖
  • 解耦:降低程序之间的依赖关系
  • 实际开发中:编译器不依赖,运行时才依赖
  • 解耦的思路
    • 第一步:使用反射创建对象,而避免new关键字
    • 第二步:通过读取配置文件来获取要创建的对象全限定类名

10.曾经代码中的问题分析

  • 在表现层new的service层的类,在service中new的dao类,具有高耦合性

11. 编写工厂类和配置文件

  • Bean:在计算机英语中,有可重用组件的含义.
  • javabean != 实体类 javabean>实体类

  • 解耦
    1. 一个配置文件来配置service和dao
      1. 配置都得内容:唯一标识=全限定类名(key=value)
    2. 通过读取配置文件的内容,反射创建对象

12.工程模式解耦

  • 在properties获取输入流时,不要使用new输入流,因为不能保证可以复用,使用BeanFactory.class.getClassLoader().getResourceAsStream(“bean.prperties”)

13.分析工厂模式的问题并改造

  • 之前的工厂是多例的,如果是单例,类只被创建一次,类属性也就被初始化一次.
  • 定义一个Map,用来存放我们要创建的对象,把它称为容器

14.工厂模式解耦的升级版

  • 将查找到的Bean中存入Map,修改get方法为return map.get

15.IoC的概念和作用

  • 控制反转,把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语.它包括依赖注入(DI)和依赖查找(Dependency Lookup)
  • IoC的作用:削减计算机程序的耦合(解除我们代码中的依赖关系)

16.Spring的IoC的前期准备

17.Spring基于XML的IOC环境的搭建和入门

  • 导入maven坐标
  • new xpt
  • getBean

18.ApplicationContext的三个实现类

  • ApplicontionContext的三个常用实现类
  • ClassPathXmlApplicationContext 加载类路径下的配置文件,要求配置文件必须在类路径下
  • FileSystemXmlApplicationContext 加载磁盘任意路径下的配置文件(必须有访问权限)
  • AnnotationFigApplicationContext 用于读取注解创建容器

19.BeanFactory和ApplicationContext的区别

  • ApplicationContext:
    • 创建容器时,参加对象采用的策略是采用立即加载的法师,只要一读取完配置文件马上就创建配置文件中的配置的对象
    • 单例对象运用
    • 因为是子接口,所以更常用
  • BeanFactory:
    • 采用延迟加载的方式,根据id获取对象了,才真正的创建对象
    • 多例对象运用

20.Spring中的细节之三种创建Bean对象的方式

  1. 创建bean的三种方式(当需要的类存在与jar包中,又没有提供无参的构造函数,又因为无法修改源代码,就可以使用二三的方法)
    1. 使用默认构造函数创建,在spring的配置文件使用bean标签,配以id和class属性后,且没有其他属性和标签时.采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
    2. 使用普通工程的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
      1. factory-bean=”instanceFactory
      2. factory-method=”getAccountService”
    3. 使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
      1. class=”工程全类名”
      2. factory-method=”getAccountService”
  2. bean对象的作用范围
  3. bean对象的生命周期

21.Spring中的细节之作用范围

  • bean的作用范围的调整
    • scope属性
    • 用于指定bean的作用范围
      • singleton:单例(默认值)
      • prototype:多例
      • request:作用于web应用的请求范围
      • session:作用于web应用的会话范围
      • global-session:作用于集群环境的会话范围(全局会话范围),当不是集群的环境时它就是session

22.spring中的细节之生命周期

  • Bean的生命周期
    • 单例对象
      • 容器创建时出生
      • 容器还在,对象一直活着
      • 容器销毁,对象消亡
      • 总结:单例对象的生命周期和容器相同
    • 多例对象
      • 当使用对象时创建
      • 对象只要在使用中一直存在
      • 当对象长时间不用,且没有其他对象引用时,由gc回收

23.spring的依赖注入

  • spring的依赖注入
    • Dependency Injection 依赖注入
    • 依赖关系的维护都交给spring类维护,在当前类中使用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
    • 依赖关系的维护就称之为依赖注入
    • 依赖注入:
      • 能注入的数据
      • 基本类型和string
      • 其他bean类型(在配置文件中或注释配置过的bean)
      • 复杂类型/集合类型
    • 注入的方式有三:
      • 使用构造函数提供
      • 使用set方法提供
      • 使用注解提供

24.构造函数注入

  • 构造函数注入
    • 如果是经常变化的数据,不适合注入
    • * 出现在bean标签的内部 * 标签中的属性 * type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型 * index:指定要注入的数据给构造函数中指定索引的参数赋值,索引的位置从0开始 * name:用于指定个体构造函数指定名称的参数赋值 * value:用于提供基本类型和string类型的数据 * ref:用于指定其他bean类型的数据,它就是指在spring的ioc核心容器中出现过的bean对象 * 优点:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功 * 弊端:该变了bean对象的实例化方式,使我们在创建对象时即使不使用的数据也必须提供

25.set方法注入(更常用)

  • set方法注入
    • property
    • 出现在bena标签的内部
    • 标签的属性
      • name:用于指定注入时所调用的set方法名称
      • value
      • ref
    • 优势:创建对象时没有明确的限制,可以直接使用默认构造函数
    • 弊端:如果某个成员必须有值,则对象的set方法可能没有执行

26.注入集合数据

  • 用于给LIst集合注入的标签
    • list array set
  • 用于给Map结构注入的标签
    • map props
  • 结构相同,标签可以互换

27.课程知识梳理

  • 预习注解

28.今日课程内容介绍

  • spring中ioc的采用注解
  • 案例使用xml方式和注解方式实现单表的CRUD的操作
    • 持久层技术选择:dbutils
  • 改造基于注解的ioc案例,使用纯注解的方式实现
    • spring中的一些新注解的使用
  • spring和Junit整合

29.采用IOC注解按照作用分类

  • 在类中添加注解实现解耦
  • 分类
    • 用于创建对象的
      • 与xml中的bean功能相同
    • 用于注入数据的
      • bean标签中property标签的功能相同
    • 用于改变作用范围的
      • bean中scope标签功能相同
    • 和生命周期相关的
      • bean中init-method和destroy-method的作用相同

30.用于创建的Component注解

  • 作用:用于把当前类存入spring容器中
  • 属性:
    • value:用于指定bean的id.当我们不写,它的默认值为当前类名,并且首字母小写
  • 需要告知spirng在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是名称为context名称空间和约束中
  • <context:component-scan base-package=”com.itheima”/>
  • 注解中只有一个value可以不写value

31.由Component衍生来的注解

  • Controller:一般用于表现层
  • Service:一般用于业务层
  • Repository:一般用于持久层
  • 以上三个注解的作用和属性和Component是一模一样的,它们三个是一模一样的,它们三个是spirng框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

32.自动按照类型注入

  • AutoWired:
    • 作用:
      • 自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
      • 如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,报错
      • 如果ioc容器中有多个匹配的类型,先匹配类型,相同则再比骄傲变量名,相同则可以注入,不同则报错
    • 出现位置:
      • 可以是变量,也可以是方法上
    • 细节:
      • 在使用注解注入时,set方法就不是必须的

33. 用于数据注入的注解

  • Qualifier
    • 作用:在按照类中注入的继承上再按照名称注入,它在给类成员注入时不能单独使用,但是给方法参数注入时可以
    • 属性
      • value:用于指定注入bean的id
  • Resource
    • 作用:注解按照Bean的id注入,它可以独立使用
    • 属性:
      • name:用于指定bean的id

以上三个注入都只能注入其他bean类型的数据,而基本类型和string类型无法使用上述注解实现,另外集合类型的注入只能通过XML实现

  • value
    • 作用:用于注入基本类型和string的类型
    • 属性:
      • value:用于指定数据的值,它可以使用spring中SpEL(也就是spring的el表达式)
      • SpEL的表达式:${表达式}

2019/12/24 20:47

作者

liukun

发布于

2020-06-22

更新于

2021-04-15

许可协议