视频链接:https://www.bilibili.com/video/BV1q94y1o7ts?vd_source=9545770e4a2968c05878ffac8589ec6c 视频选集:P1— P38
1.Spring概述
spring框架:它是一个容器,是整合其它框架的框架.核心是TOC和AOP.它由20多个模块构成.在很多领域都提供优秀的解决方案.
1.1 Spring框架
- Spring是于2003年兴起的一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IOC)和面向切面编程(AOP)。 Spring是可以在Java SE/EE中使用的轻量级开源框架。
- Spring的主要作用就是为代码"解耦”,降低代码间的耦合度。就是让对象和对象(模块和模块)之间关系不是使用代码关联,而是通过配置来说明。即在 Spring中说明对象(模块)的关系。
- Spring根据代码的功能特点,使用IOC 降低业务对象之间耦合度。IOC使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由Spring 容器统一管理,自动“注入",注入即赋值。而AOP使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务"混杂”到主业务逻辑中了,而是由 Spring 容器统一完成“织入”。
- 官网: https://spring.io/【Spring 官网有Spring家族技术的介绍,有相应框架的jar包和文档,还有源码文件】
1.2 Spring特点
- 轻量级:由20多个模块构成,每个jar包都很小,小于1M,核心包也就3M左右.对代码无污染
- 面向接口编程:使用接口,就是面向灵活,项目的可扩展性,可维护性都极高.接口不关心实现类的类型.使用时接口指向实现类,切换实现类即可切换整个功能.
- AOP:面向切面编程【将公共的,通用的,重复的代码单独开发,在需要的时候反织回去.底层的原理是动态代理.】
- 整合其它框架【整合后使其它框架更易用】
1.3 Spring体系结构
Spring 由20多个模块组成,它们可以分为数据访问/集成(Data Access/Integration).Web、面向切面编程(AOP Aspects)提供JVM的代理(Instrumentation.消息发送(Messaging)核心容器(Core Container)和测试( Test)。
2. IOC 控制反转【基于xml】
控制反转IOC(Inversion of Control)是一个概念,是一种思想。由spring容器进行对象的创建和依赖注入.程序员在使用时直接取出使用. 正转:由程序员进行对象的创建和依赖注入称为正转.程序员说了算.
反转:由spring容器创建对象和依赖注入称为反转,将控制权从程序员手中夺走,交给spring容器,称为反转.容器说了算
- IOC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖注入。应用广泛。
- 依赖: classA类中含有 classB的实例,在 classA中调用classB的方法完成功能,即classA对classB有依赖。
- 依赖注入:Dl(Dependency Injection),程序代码不做定位查询,这些工作由容器自行完成。依赖注入DI是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
- Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关系的管理。Spring框架使用依赖注入(DI)实现IOC
- Spring 容器是一个超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。Spring容器管理着容器中 Bean之间的依赖关系,Spring使用“依赖注入”的方式来管理Bean之间的依赖关系。使用IOC实现对象之间的解耦和。
2.1 spring创建对象
2.2 给创建的对象赋值
- 使用setter注入
简单类型注入:使用value属性 引用类型注入:使用ref属性 注意:使用setter注入必须提供无参的构造方法,必须提供setXXX()方法
简单类型注入: 引用类型注入: 先定义school类,然后在student中对school类进行引用
- 使用构造方法注入
Student stu = new student (“张三”,22) ;【使用构造方法创建对象的同时初始化对象】
a.使用构造方法的参数名字进行注入值 创建对象: 注入:【其中name 和 address都是构造方法的名称】 测试:
b.使用构造方法参数的下标注入值 定义一个学生类,其中包含一个school 测试:
c.使用默认的构造方法的参数的顺序注入值 测试:
2.3 项目案例
使用三层架构进行用户的插入操作:界面层,业务逻辑层,数据访问层(模拟)
spring接管下的三层项目构建:
实体类
com.bjpowernode.pojo Users
数据访问层
com. bjpowernode.dao UsersMapper.java(接口)
UsersMapperImpl.java(实现类)
业务逻辑层
com. bjpowernode .service UsersService.java(接口)
UsersserviceImpl.java (实现类)
界面层
com.bjpowernode.controller Userscontroller.java
实体类的创建: 数据访问层: 定义接口: 同一个目录下写接口的实现类: 业务逻辑层: 定义接口: 同一个目录下写接口的实现类: 界面层: 测试:
2.4 Spring 接管三层对象的创建
添加Spring依赖:
创建数据访问层对象:
创建业务逻辑层的对象:
创建界面层的对象:
测试:
3.基于注解的IOC
3.1 基本概念
也称为DI (Dependency Injection),它是IOC的具体实现的技术. 上面使用xml来创建对象并依赖注入,在这里使用注解annotation创建对象并依赖注入 基于注解的IOC,必须要在spring的核心配置文件中添加包扫描
- 创建对象的注解
@Component:可以创建任意对象. @Controller:专门用来创建控制器的对象(Servlet),这种对象可以接收用户的请求,可以返回处理结果给客户端. @Service:专门用来创建业务逻辑层的对象,负责向下访问数据访问层,处理完毕后的结果返回给界面层. @Repository:专门用来创建数据访问层的对象,负责数据库中的增删改查所有操作. - 依赖注入的注解
简单类型(8种基本类型+String)的注入:@Value【用来给简单类型注入值】 引用类型的注入: A.@Autowired【使用类型注入值,从整个Bean工厂中搜索同源类型的对象进行注入】 B.@Autowired ,@Qualifier【使用名称注入值,从整个Bean工厂中搜索相同名称的对象进行注入】
3.2 @Component
创建的对象的默认名称是类名的驼峰命名法.也可以指定对象的名称@Component(“指定名称”).
先搭建项目,修改目录,修改pom.xml文件
- 创建student类
- 添加包扫描
- 测试类
- 取出对象
3.3 简单类型注入
3.4 引用类型注入
同源类型也可注入 同源类型: a.被注入的类型(Student中的school)与注入的类型是完全相同的类型 b.被注入的类型(Student中的school父)与注入的类型(子)是父子类 c.被注入的类型(Student中的school接口)与注入的类型(实现类)是接口和实现类的类型
3.4.1 按类型注入
按类型注入,School中的 @Component一定要加上 创建school对象: 创建student对象:
测试类:
3.4.2 按名称注入
改变School对象:
改变Student对象: 测试案例不变
3.4.3 有父子类的情况
- 按类型注入值:【注意:在有父子类的情况下,使用按类型注入,就意味着有多个可注入的对象.此时按照名称进行二次筛选,选中与被注入对象相同名称的对象进行注入.】
School对象:
定义SubSchool对象【继承School对象】: Student对象: 测试: 测试结果:
- 按名称注入值:【注意:如果有父子类的情况下,直接按名称进行注入值.】
3.5 基于注解的三层项目的改造
添加依赖: 添加包扫描: 添加注解: 测试:
3.6 添加包扫描的N种方式
- 单个包扫描(推荐使用)
- 多个包扫描,多个包之间以逗号或者空格或分号分隔
- 扫描根包(不推荐)【会降低容器启动的速度,导致多做无用功】
3.7 Spring配置文件的拆分
当项目越来越大,需要多人合作开发,一个配置就存在很大隐患,就需要拆分配置文件 拆分配置文件的策略:
-
A.按层拆 -
B.按功能拆
3.8 Spring配置文件的整合
- 单个文件导入
测试:
- 批量导入
- 基于注解的三层项目的配置文件改造
单独创建三个.xml
3.9 基于xml的引用类型的自动注入
在整个bean工厂中搜索,有没有这种类型的对象,有就自动注入
|