01_Spring概述

spring(ioc、di) - 图2Spring是什么?
spring(ioc、di) - 图3Spring是分层的 Java SE/EE应用轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。
spring(ioc、di) - 图4提供了视图层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的
JavaEE企业应用开源框架
spring(ioc、di) - 图5Spring的发展历程
spring(ioc、di) - 图6创始人:Rod Johnson
spring(ioc、di) - 图7https://spring.io/
spring(ioc、di) - 图8Spring的优势
spring(ioc、di) - 图9方便解耦,简化开发
spring(ioc、di) - 图10AOP 编程的支持
spring(ioc、di) - 图11声明式事务的支持
spring(ioc、di) - 图12方便程序的测试
spring(ioc、di) - 图13Spring的体系
spring(ioc、di) - 图14

Beans,Core,Context,SpEL

spring(ioc、di) - 图1502_Spring资源包说明

spring(ioc、di) - 图16下载地址:
spring(ioc、di) - 图17http://maven.springframework.org/release/org/springframework/spring/
spring(ioc、di) - 图18说明:通过Maven部署资源从仓库获取(后期课程)

spring(ioc、di) - 图19资源文件

  1. //spring依赖包
  2. spring‐framework‐5.1.8.RELEASE‐dist
  3. //spring文档
  4. spring‐framework‐5.1.8.RELEASE‐docs
  5. //spring约束文件
  6. spring‐framework‐5.1.8.RELEASE‐schema

spring(ioc、di) - 图20C.核心jar(4个),日志包(1个)

  1. spring‐beans‐5.1.8.RELEASE.jar
  2. spring‐context‐5.1.8.RELEASE.jar
  3. spring‐core‐5.1.8.RELEASE.jar
  4. spring‐expression‐5.1.8.RELEASE.jar
  5. spring‐jcl‐5.1.8.RELEASE.jar

03_Spring入门案例

spring(ioc、di) - 图21导入jar包(4个)
spring(ioc、di) - 图22在classpath目录下创建核心配置文件(spring.xml)

  1. <?xml version="1.0" encoding="UTF‐8" ?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring‐beans.xsd ">
  7. </beans>

spring(ioc、di) - 图23将应用程序需要使用的资源配置成Spring的Bean实例

  1. <!‐‐ 所有资源以Bean的形式存在 ‐‐>
  2. <!‐‐ bean:声明一个资源Bean ‐‐>
  3. <!‐‐ bean:id:用于区分bean的标识 ‐‐>
  4. <!‐‐ bean:class:bean对应的模型类名 ‐‐>
  5. <bean id="user" class="cn.qzw.bean.User"></bean>

spring(ioc、di) - 图24测试

  1. ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
  2. Object user = ctx.getBean("user");


04_使用 spring 的 IOC 解决程序耦合

spring(ioc、di) - 图25控制反转IoC(Inversion of Control)
spring(ioc、di) - 图26控制:控制的双方是什么?谁控制谁?
spring(ioc、di) - 图27主控方:Spring
spring(ioc、di) - 图28被控方:应用程序所使用的资源
spring(ioc、di) - 图29(原始)应用程序直接控制需要的外部资源
spring(ioc、di) - 图30(Spring)Spring控制所需要的外部资源
spring(ioc、di) - 图31spring(ioc、di) - 图32反转:什么是反转?反转什么?
spring(ioc、di) - 图33正向:应用程序直接调用资源
spring(ioc、di) - 图34反向:应用程序依赖Spring为其提供资源
spring(ioc、di) - 图35反转的是资源的控制权
spring(ioc、di) - 图36应用程序由主动调用资源,变为被动的等待Spring提供资源
spring(ioc、di) - 图37有什么好处?
spring(ioc、di) - 图38正向缺点:应用程序控制的资源分布在程序的每一个地方
spring(ioc、di) - 图39反向的优点:所有的资源都在Spring中,便于管理,降低了耦合度。
spring(ioc、di) - 图40总结:
spring(ioc、di) - 图41Spring反向控制应用程序所需要使用的外部资源。资源受Spring管理,利用率最大化。

05_ApplicationContext的三个实现类

image.png
spring(ioc、di) - 图43查看继承关系
spring(ioc、di) - 图44ClassPathXmlApplicationContext源码下,右键->Diagrams->show diagrams
spring(ioc、di) - 图45选中ApplicationContext-> show implementations
spring(ioc、di) - 图46ApplicationContext 接口的实现类
spring(ioc、di) - 图47ClassPathXmlApplicationContext:
spring(ioc、di) - 图48它是从类的根路径下加载配置文件 推荐使用这种
spring(ioc、di) - 图49FileSystemXmlApplicationContext:
spring(ioc、di) - 图50它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
spring(ioc、di) - 图51AnnotationConfigApplicationContext:
spring(ioc、di) - 图52当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
spring(ioc、di) - 图53代码测试
spring(ioc、di) - 图54ClassPathXmlApplicationContext源码下

  1. ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml")

spring(ioc、di) - 图55FileSystemXmlApplicationContext

  1. FileSystemXmlApplicationContext application = new FileSystemXmlApplicationContext("A:\\workspace\\idea\\spring\\src\\applicationCo ntext.xml");


06_BeanFactory和ApplicationContext的区别

spring(ioc、di) - 图56BeanFactory 才是Spring容器中的顶层接口。ApplicationContext 是它的子接口。
spring(ioc、di) - 图57BeanFactory 和 ApplicationContext 的区别:
spring(ioc、di) - 图58ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
spring(ioc、di) - 图59BeanFactory:什么使用什么时候创建对象。
spring(ioc、di) - 图60代码测试

  1. BeanFactory application = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
  2. IUserService userService = (IUserService) application.getBean("userService");


07_Spring创建对象

spring(ioc、di) - 图61A.Spring创建对象的三种方式
spring(ioc、di) - 图62构造器初始化【重点】:
spring(ioc、di) - 图63Bean对应的类必须提供一个无参构造方法
spring(ioc、di) - 图64静态工厂初始化【了解】
spring(ioc、di) - 图65提供一个工厂类,使用其中的静态方法获取对象

  1. public class Bean01Factory {
  2. public static Bean01 getBean() {
  3. return new Bean01();
  4. }
  5. }
  1. <bean id="bean01" factorymethod="getBean" class="com.qzw.util.Bean01Factory">
  2. </bean>

spring(ioc、di) - 图66实例工厂初始化【了解】
spring(ioc、di) - 图67提供一个工厂类,使用其中的普通方法获取对象

  1. public class Bean02Factory {
  2. public Bean01 getBean() {
  3. return new Bean01();
  4. }
  5. }


  1. <bean id="bean01" factorymethod="getBean" factorybean="factory"></bean>
  2. <bean id="factory" class="com.qzw.util.Bean02Factory"></bean>

08_Bean的作用域及生命周期


取值范围 说明
singleton 默认值,单例的
prototype 多例的
request WEB项目中,Spring创建一个Bean的对象,将对象存入到reques t域中
session WEB项目中,Spring创建一个Bean的对象,将对象存入到session 域中
global sessio n WEB项目中,在Portlet环境,如果没有Portlet环境,相当于sessio n

spring(ioc、di) - 图68更改作用域的方法

  1. //scope属性:singleton:单例 ;prototype:非单例
  2. <bean id=”beanId” class=”BeanClassName” scope=”prototype”></bean>


09_Bean的生命周期

spring(ioc、di) - 图69单例对象: scope=”singleton”
spring(ioc、di) - 图70一个应用只有一个对象的实例。它的作用范围就是整个引用。
spring(ioc、di) - 图71生命周期:
spring(ioc、di) - 图72对象出生:当应用加载,创建容器时,对象就被创建了。
spring(ioc、di) - 图73对象活着:只要容器在,对象一直活着。
spring(ioc、di) - 图74对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
spring(ioc、di) - 图75多例对象: scope=”prototype”
spring(ioc、di) - 图76每次访问对象时,都会重新创建对象实例。
spring(ioc、di) - 图77生命周期:
spring(ioc、di) - 图78对象出生:当使用对象时,创建新的对象实例。
spring(ioc、di) - 图79对象活着:只要对象在使用中,就一直活着。

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608879750527-7fac0f43-e388-4324-bac7-405ac98a4428.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608879750085-6001ad48-dfdf-4bf8-9993-18c14f74d450.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)监听<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608879750085-6001ad48-dfdf-4bf8-9993-18c14f74d450.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)init-method:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608879747313-0a121bba-c477-4dba-8b22-d7c078840024.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)初始化回调方法名,配置的方法必须由bean对象提供<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608879750085-6001ad48-dfdf-4bf8-9993-18c14f74d450.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)destroy-method:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608879747313-0a121bba-c477-4dba-8b22-d7c078840024.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)销毁回调方法名,配置的方法必须由bean对象提供
  1. <bean id="user" class="cn.qzw.bean.User" initmethod="init" destroymethod="destroy" scope="singleton">
  2. </bean>

10_依赖注入DI

spring(ioc、di) - 图80依赖注入: Dependency Injection。
spring(ioc、di) - 图81它是 Spring 框架核心 IOC 的具体实现。
spring(ioc、di) - 图82在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况
spring(ioc、di) - 图83IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法,那这种业务层和持久层的依赖关系,在使用Spring之后,就让Spring来维护了。简单的说,就是框架把持久层对象传入业务层,而不用我们自己去获取。
spring(ioc、di) - 图84依赖注入的数据类型
spring(ioc、di) - 图85基本数据类型和String
spring(ioc、di) - 图86javaBean类型
spring(ioc、di) - 图87复杂类型/集合类型
spring(ioc、di) - 图88依赖注入的方式
spring(ioc、di) - 图89使用构造函数注入
spring(ioc、di) - 图90使用set方法注入
spring(ioc、di) - 图91使用注解

11_构造器注入

spring(ioc、di) - 图92顾名思义,就是使用类中的构造函数,给成员变量(简单类型、javaBean)赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。
spring(ioc、di) - 图93具体步骤如下:
spring(ioc、di) - 图94a.提供对应的构造方法
spring(ioc、di) - 图95spring(ioc、di) - 图96b.配置构造方法的参数需求1:
spring(ioc、di) - 图97给简单类型注入值
spring(ioc、di) - 图98javaBean类

  1. public class User {
  2. private int id;
  3. private String password;
  4. public User() {};
  5. public User(int id, String username, String password) {
  6. this.id = id;
  7. this.username = username;
  8. this.password = password;
  9. }
  10. }

spring(ioc、di) - 图99spring.xml配置文件

  1. <bean id="user1" class="com.qfedu.bean.User">
  2. <constructorarg name="id" value="1"></constructorarg>
  3. <constructorarg name="username" value="root"></constructorarg>
  4. <constructorarg name="password" value="root"></constructorarg>
  5. </bean>

spring(ioc、di) - 图100测试代码

  1. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
  2. User user = (User) applicationContext.getBean("user1");
  3. System.out.println(user);


spring(ioc、di) - 图101需求2:
spring(ioc、di) - 图102给javaBean注入值
spring(ioc、di) - 图103javaBean类

  1. //用户类
  2. public class User {
  3. private int id;
  4. private String username;
  5. private String password;
  6. private Order order;
  7. public User() {}
  8. public User(int id, String username, String password, Order order) {
  9. this.id = id;
  10. this.username = username;
  11. this.password = password;
  12. this.order = order;
  13. }
  14. }
  15. //订单类
  16. public class Order {
  17. private int id;
  18. private String name;
  19. public Order() {}
  20. public Order(int id, String name) {
  21. this.id = id;
  22. this.name = name;
  23. }
  24. }

spring(ioc、di) - 图104spring.xml配置文件

  1. <bean id="user1" class="com.qfedu.bean.User">
  2. <constructorarg name="id" value="1"></constructorarg>
  3. <constructorarg name="username" value="root"></constructorarg>
  4. <constructorarg name="password" value="root"></constructorarg>
  5. <constructorarg name="order" ref="order"></constructorarg>
  6. </bean>
  7. <bean id="order" class="com.qfedu.bean.Order">
  8. <constructorarg name="id" value="123"></constructorarg>
  9. <constructorarg name="name" value="订单一"></constructorarg>
  10. </bean>

spring(ioc、di) - 图105测试代码

  1. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
  2. User user = (User) applicationContext.getBean("user1");
  3. System.out.println(user);


12_set方法注入

spring(ioc、di) - 图106顾名思义,就是在类中提供需要注入成员的set方法给成员变量(简单类型、javaBean)赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。
spring(ioc、di) - 图107具体步骤如下:
spring(ioc、di) - 图108提供对应的set方法
spring(ioc、di) - 图109配置set方法的参数
spring(ioc、di) - 图110需求1:
spring(ioc、di) - 图111给简单类型注入值
spring(ioc、di) - 图112javaBean类

  1. public class User {
  2. private int id;
  3. private String username;
  4. private String password;
  5. //无参/有参构造方法
  6. public void setId(int id) {
  7. this.id = id;
  8. }
  9. public void setUsername(String username) {
  10. this.username = username;
  11. }
  12. public void setPassword(String password) {
  13. this.password = password;
  14. }
  15. //toString方法
  16. }

spring(ioc、di) - 图113spring.xml配置文件

  1. <bean id="user1" class="com.qfedu.bean.User">
  2. <property name="id" value="1"></property>
  3. <property name="username" value="root"></property>
  4. <property name="password" value="root"></property>
  5. </bean>

spring(ioc、di) - 图114测试代码

  1. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
  2. User user = (User) applicationContext.getBean("user1");
  3. System.out.println(user);





spring(ioc、di) - 图115需求2:
spring(ioc、di) - 图116给javaBean注入值
spring(ioc、di) - 图117javaBean类

  1. public class User {
  2. private int id;
  3. private String username;
  4. private String password;
  5. private Order order;
  6. //无参有参构造方法
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getUsername() {
  14. return username;
  15. }
  16. public void setUsername(String username) {
  17. this.username = username;
  18. }
  19. public String getPassword() {
  20. return password;
  21. }
  22. public void setPassword(String password) {
  23. this.password = password;
  24. }
  25. //toString方法
  26. }

spring(ioc、di) - 图118spring.xml配置文件

  1. <bean id="user1" class="com.qfedu.bean.User">
  2. <property name="id" value="1"></property>
  3. <property name="username" value="root"></property>
  4. <property name="password" value="root"></property>
  5. <property name="order" ref="order"></property>
  6. </bean>
  7. <bean id="order" class="com.qfedu.bean.Order">
  8. <property name="id" value="123"></property>
  9. <property name="name" value="订单一"></property>
  10. </bean>

spring(ioc、di) - 图119测试代码

  1. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
  2. User user = (User) applicationContext.getBean("user1");
  3. System.out.println(user);

13_集合注入

spring(ioc、di) - 图120顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。我们这里介绍注入数组, List,Set,Map。
spring(ioc、di) - 图121代码实现

  1. public class Bean01 {
  2. private String[] myStrs;
  3. private List < String > myList;
  4. private Set < String > mySet;
  5. private Map < String,
  6. String > myMap;
  7. private Properties myProps;
  8. //Setter方法
  9. }
  1. <bean id="bean01" class="com.qzw.bean.Bean01">
  2. <property name="myStrs" >
  3. <array>
  4. <value>aaa</value>
  5. <value>bbb</value>
  6. </array>
  7. </property>
  8. <property name="myList">
  9. <list>
  10. <value>aaa</value>
  11. <value>bbb</value>
  12. </list>
  13. </property>
  14. <property name="mySet">
  15. <list>
  16. <value>aaa</value>
  17. <value>bbb</value>
  18. </list>
  19. </property>
  20. <property name="myMap">
  21. <map>
  22. <entry key="key1" value="value1" ></entry>
  23. </map>
  24. </property>
  25. </bean>


14_团队开发

spring(ioc、di) - 图122团队开发时,每个独立的模块制作成一个独立的配置文件
spring(ioc、di) - 图123同一个工程中,仅配置一个主配置文件applicationContext.xml,其中添加公用信息对应的
Bean,每个开发人员根据自己的模块需求,制作独立的配置文件

  1. spring01.xml
  2. spring02.xml
  3. spring03.xml

spring(ioc、di) - 图124多配置文件加载
spring(ioc、di) - 图125格式一(掌握):
spring(ioc、di) - 图126在主配置文件(spring.xml)中导入子配置文件

  1. <import resource="spring01.xml"/>
  2. <import resource="spring02.xml"/>
  3. <import resource="spring03.xml"/>

spring(ioc、di) - 图127加载ApplicatioContext对象时需要加载主配置文件即可

  1. ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");


spring(ioc、di) - 图128格式二:
spring(ioc、di) - 图129一次性加载多个配置文件(可变参数对象格式)

  1. ApplicationContext ctx = new ClassPathXmlApplicationContext("spring01.xml","spring02.xml","spring03.xml");


spring(ioc、di) - 图130格式三:
spring(ioc、di) - 图131一次性加载多个配置文件(数组对象格式)

  1. ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]
  2. {"spring01.xml","spring02.xml","spring03.xml"});


spring(ioc、di) - 图132注意事项
spring(ioc、di) - 图133配置冲突问题,后生效的配置覆盖之前的配置!!!