Spring笔记01
Spring笔记01 Spring快速上手+IOC+注解
01. Spring共四天
- 第一天:spring框架的概述和spring中基于XML的IOC配置
- 第二天:基于注解的IOC和IOC的案例
- 第三天:spring中的aop和基于XML和注解的AOP配置
- 第四天;spring中的JDBCTemlate以及Spring事务控制
02.今天课程内容概述
- spring的概述
- spring是什么
- spring的两大核心
- spring的发展经历和优势
- spring的体系结构
- 程序的耦合以及解耦
- IOC概念和spring中的IOC
- spring中基于XML的IOC环境搭建
- 依赖注入(Dependency Injection)
- 作业
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
- 注册驱动
- 获取连接
- 获取操作数据库的预处理对象
- 执行SQL,得到结果集
- 遍历结果集
- 释放资源
08.编译期依赖
- 如果一个类中需要使用一个jar包,没有的话编译期就会失败,这就可以理解为程序的耦合
09.程序的耦合和解耦的思路分析
- 耦合:程序之间的依赖关系
- 类之间的依赖
- 方法间的依赖
- 解耦:降低程序之间的依赖关系
- 实际开发中:编译器不依赖,运行时才依赖
- 解耦的思路
- 第一步:使用反射创建对象,而避免new关键字
- 第二步:通过读取配置文件来获取要创建的对象全限定类名
10.曾经代码中的问题分析
- 在表现层new的service层的类,在service中new的dao类,具有高耦合性
11. 编写工厂类和配置文件
- Bean:在计算机英语中,有可重用组件的含义.
- javabean != 实体类 javabean>实体类
- 解耦
- 一个配置文件来配置service和dao
- 配置都得内容:唯一标识=全限定类名(key=value)
- 通过读取配置文件的内容,反射创建对象
- 一个配置文件来配置service和dao
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的前期准备
- 只能解耦,不能消除,只能降低依赖
- 下载开发包
- https://spring.io/
17.Spring基于XML的IOC环境的搭建和入门
- 导入maven坐标
- new xpt
- getBean
18.ApplicationContext的三个实现类
- ApplicontionContext的三个常用实现类
- ClassPathXmlApplicationContext 加载类路径下的配置文件,要求配置文件必须在类路径下
- FileSystemXmlApplicationContext 加载磁盘任意路径下的配置文件(必须有访问权限)
- AnnotationFigApplicationContext 用于读取注解创建容器
19.BeanFactory和ApplicationContext的区别
- ApplicationContext:
- 创建容器时,参加对象采用的策略是采用立即加载的法师,只要一读取完配置文件马上就创建配置文件中的配置的对象
- 单例对象运用
- 因为是子接口,所以更常用
- BeanFactory:
- 采用延迟加载的方式,根据id获取对象了,才真正的创建对象
- 多例对象运用
20.Spring中的细节之三种创建Bean对象的方式
- 创建bean的三种方式(当需要的类存在与jar包中,又没有提供无参的构造函数,又因为无法修改源代码,就可以使用二三的方法)
- 使用默认构造函数创建,在spring的配置文件使用bean标签,配以id和class属性后,且没有其他属性和标签时.采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
- 使用普通工程的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
- factory-bean=”instanceFactory
- factory-method=”getAccountService”
- 使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
- class=”工程全类名”
- factory-method=”getAccountService”
- bean对象的作用范围
- 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的表达式:${表达式}