• IOC容器 | 内容 | 说明 | 重要程度 | | —- | —- | —- | | Spring框架介绍 | Spring IOC、DI和AOP等核心概念 | ※※※※※ | | Spring IOC容器 | Spring实例化与管理对象 | ※※※※※ | | 集合对象注入 | 注入List、Set、Map集合对象 | ※※※※※ | | 底层原理 | Spring Bean 的声明周期 | ※※※※※ | | 注解与Java Config | Spring 注解分类和常用注解应用 | ※※※※※ |

  • AOP | 内容 | 说明 | 重要程度 | | —- | —- | —- | | 理解AOP及名词 | Spring AOP开发与配置流程 | ※※※※ | | 五种通知类型 | Spring 五种通知类型和应用场景 | ※※※ | | 切点表达式 | PointCut切点表达式的语法规则及应用 | ※※ | | 代理模式 | JDK动态代理和GCLib代理的执行过程 | ※※※※ |

  • Spring JDBC与声明式事务 | 内容 | 说明 | 重要程度 | | —- | —- | —- | | Spring JDBC | Spring JDBC的环境配置 | ※※※※ | | RestTemplate | 基于RestTemplate实现SQL处理 | ※※※ | | 配置声明式事务 | 声明式事务的配置过程 | ※※※※※ | | 事务传播行为介绍 | 讲解常用事务传播行为的用途 | ※※※ | | 声明式事务注解形式 | 基于注解使用声明式事务 | ※※※※※ |

一、Spring IOC

1、Spring快速入门

1、Ioc控制反转:集中管理对象的创建和管理的容器称为IOC控制反转容器,由于对象的控制权发生了变化,所以将其称之为控制反转。
  • IOC控制反转:全称Inverse Of Control 是一种设计理念,将对象的控制权交由第三方进行管理
  • 由代理人来创建与管理对象,消费者通过代理人来获取对象
  • Ioc的目的是降低对象之间直接耦合
  • 加入Ioc容器将对象统一管理,让对象 关联编程弱耦合

2、DI依赖注入:利用反射技术来完成对象之间的依赖关系,这个过程就叫做DI依赖注入

  • IOC 是设计理念,是现代程序设计遵循的标准,是宏观目标
  • DI(Dependency Injection)是具体的技术实现,是微观实现。(具体的语言环境下技术的实现)
  • DI在Java中利用反射技术实现对象注入(Injection)
  • 依赖注入根据语言不同,具体的实现方案也不一样

3、Spring的含义

  • Spring可从狭义和广义两个角度看待
  • 狭义的Spring是指Spring框架(Spring Framework)
    • Spring框架是企业开发复杂性的一站式解决方案
    • Spring框架的核心是IOC容器与AOP面向切面编程
    • Spring IOC负责创建与管理系统对象,并在此基础上扩展功能
  • 广义的Spring是指Spring生态体系
    • Spring IOC是Spring最核心、最基础的一部分,这是因为系统中所有的对象被统筹管理,在此基础上生根发芽,扩展出来了若干不同功能的子项目,目前的Spring可以说是一站式的综合解决方案。
    • Spring Cloud :分布式微服务
    • Reactive:响应式编程,这是一种异步的全新的开发理念和技术
    • Cloud:云端技术
    • Web apps :Spring MVC,web 应用程序的开发
    • Serverless:无服务器编程,在程序运行过程中,摆脱服务器的束缚,从而让用户获得更好的体验

4、传统开发方式

  • 对象直接引用导致对象硬性关联,程序难以扩展维护

5、SpringIOC容器

  • IoC容器时Spring生态的地基,用于统一创建和管理对象依赖

6、Spring IOC容器职责

  • 对象的控制权交由第三方统一管理(IOC控制反转)
  • 利用Java反射技术实现运行时对象创建与关联(DI 依赖注入)
  • 基于配置提高应用程序的可维护性与扩展性

    2、Spring XML配置

    1、XMl管理对象(Bean

  • 基于XML配置Bean

    • applicationContext.xml

      1. <bean id="rdApple" class="com.imooc.spring.ioc.entity.Apple">
      2. <property name="title" value="蛇果"></property>
      3. <property name="color" value="红色"></property>
      4. <property name="origin" value="美国"></property>
      5. </bean>
    • 创建IOC容器并根据配置文件创建对象

      1. // 当前java 运行内存保存了IOC容器,并且IOC容器根据配置创建了对应的对象,并对这些对象进行管理
      2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
      3. Apple sweetApple = context.getBean("sweetApple", Apple.class);
  • 基于注解配置Bean

  • 基于Java代码配置Bean

2、 实例化Bean的三种方式

  • 基于构造方法对象实例化(90%使用率) ```java
  1. - 基于静态工厂实例化
  2. ```java
  3. <!--利用静态工厂获取对象-->
  4. <bean id="apple4" class="com.imooc.spring.ioc.factory.AppleStaticFactory" factory-method="createSweetApple">
  • 基于工厂实例方法实例化
    1. <!--利用工厂实例方法获取对象-->
    2. <bean id="factoryInstance" class="com.imooc.spring.ioc.factory.AppleFactoryInstance"/>
    3. <bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
  1. Id与name属性相同点
  • bean id与name 都是这只对象在IOC容器中唯一标识
  • 两者在同一个配置文件中都不允许出现重复
  • 两者允许在多个配置为念中出现重复,新对象覆盖旧对象
  • id要求更为严格,一次只能定义一个对象表示(推荐)
  • name 更为宽松,一次允许定义多个对象标识
  • id与name的命名要求有意义,按驼峰命名书写
  1. 路径管理 | 表达式实例 | 说明 | | —- | —- | | claspath:config.xml | 扫描classpath根路径(不包含jar)的config.xml | | classpath:com/imooc/config.xml | 扫描classpath下(不包含jar)com.imooc包中的config.xml | | calsspath:com/imooc/config.xml | 扫描classpath下(包含jar)com.imooc包中的config.xml | | classpath:config-.xml | 扫描classpath根路径下所有以config-开头的XML文件,多个配置文件按ASCII码的顺序进行加载 | | classpath:com/**/config.xml | 扫描com包下(包含任何子包)的config.xml | | file:c:/config.xml | 扫描c盘根路径config.xml |

3、对象实例化配置

4、依赖注入配置
  1. 对象依赖注入
  • 依赖注入是指运行时将容器内对象利用反射赋给其他对象的操作
  • 基于setter方法注入对象
    • 利用setter实现静态数值注入
  • 基于构造方法注入对象
  1. 查看容器中对象
  2. bean scope(范围)属性
  • bean scope属性用于决定对象何时被创建与作用范围
  • bean scope配置将影响容器内对象的属性
  • bean scope默认值为singleton(单例) 指全局共享一个对象实例
  • bean scope属性清单 | scope属性 | 说明 | | —- | —- | | singleton | 单例(默认值),每一个容器有且只有唯一的实例,实例被全局共享 | | prototype | 多例,每次使用时都是创建一个实例 | | result | web环境下,每一次独立请求存在唯一实例 | | session | web环境下,每一个session存在有唯一实例 | | application | web环境下,ServletContext存在唯一实例 | | websocket | 每一次WebScoket连接中存在唯一实例
    (适用于网络客服) |

  • singleton在容器中是单例多线程执行,存在线程安全风险,根源在于对象的属性在运行时会不断的发生变化,

  • 如果一个属性,在运行过程中是恒定不变的,就可以进行单例的设计
  • prototype在容器中国多实例,占用更多资源,不存在线程安全问题
  • singleton和prototype对比 | | singleton | prototype | | —- | —- | —- | | 对象数量 | 全局唯一 | 存在多个 | | 实例化时机 | IOC容器启动时 | getBean()或对象注入时 | | 线程安全问题 | 存在 | 不存在 | | 执行效率 | 高 | 低 |

5、bean生命周期
  • IOC容器准备初始化解析XML
  • 对象实例化执行构造方法
  • 为对象注入属性
  • 调用init——method初始化方法
  • IOC容器初始化完毕
  • 执行业务代码
  • IOC容器准备销毁
  • 调用destory-method释放资源
  • IOC容器销毁完毕

    二、基于注解配置IOC容器

    1、基于注解的优势

  • 摆脱繁琐的XML形式的bean与依赖注入配置。

  • 基于”声明式“的原则,更适合轻量级的现代化企业应用。
  • 让代码的可读性变得更好,研发人员拥有更好的开发体验。

    2、三类注解

  • 组件类型注解-声明当前类的功能和职责

  • 自动装配注解-根据属性特征自动注入对象
  • 元数据注解-更细化的辅助IoC容器管理对象

    3、四种组件类型注解

    | 注解 | 说明 | | —- | —- | | @Component | 组件注解,通用注解,被该注解描述的类将被IoC容器管理并实例化 | | @Controller | 语义注解,说明该类是MVC应用中的控制器,该注解以及以下两个注解都是@Component注解的细化 | | @Service | 语义注解,说明该类是Service业务服务类 | | @Repository | 语义注解,说明该类用于业务持久层,通常用于描述DAO类 |

要使用组件注解,要开启组件扫描

  1. <context:component-scan base-package="com.imooc">
  2. <context:exclude-filter type="regex" expression="com.imooc.exl.*"/>
  3. </context:component-scan>

4、两类自动装配注解(自动装配注解就是为了依赖注入而存在的)

分类 注解 说明
按类型装配 @Autowired 按容器内对象类型动态注入属性,由Spring机构提供
@Inject 基于JSR
按名称装配 @Named
@Resource 优先按名称进行,再按类型智能匹配

如果将装配注解放在属性上,则不在执行set方法,Spring IOC容器会自动将属性的修饰符改为public,直接进行赋值
基于注解进行依赖注入,不会添加setXXX方法,在属性上加上装配注解

  • 使用@Autowire注解时,注入的元素有多个实现类时,可以使用@Primary注解标识默认使用哪一个
  • 为了避免在按类型注入冲突,使用按名称进行注入,名称在容器中唯一的
  • @Resource:优先按名称进行,再按类型智能匹配
    • @Resource: 设置name属性,则按name在IOC容器中将bean注入
    • @Resource:未设置name属性
      • 以属性名作为bean name在IOC容器中匹配Bean,如有配置则注入
      • 按属性名未匹配,则按类型进行匹配,同 @autowired,需加入@Primary解决类型冲突
  • 使用建议:在使用@Resource 对象时推荐设置name或保证属性名与bean名称一致

    5、其他元数据注解

    | 注解 | 说明 | | —- | —- | | @Primary | 按类型装配时出现多个相同类型对象,拥有此注解的对象优先被注入 | | @PostConstructor | 描述方法,相当于XML中init-method配置的注解版本 | | @PreDestory | 描述方法,相当于XMl中destory-method配置的注解版本 | | @Scope | 设置对象的scope属性 | | @Value | 为属性注入静态数据 |

5、基于JavaConfig配置IOC容器(利用Java代码来代替传统的XML文件)

  • 完全摆脱XML的束缚,使用独立Java类管理对象和依赖
  • 注解配置相对分散,利用Java Config可对配置集中管理
  • 可以在编译时进行依赖检查,不容易出错 | 注解 | 说明 | | —- | —- | | @Configuration | 描述类,说明当前类是Java Config配置类,完全替代XML文件 | | @Bean | 描述方法,方法返回对象将被IOC容器管理,beanId默认为方法名 | | @ImportResource | 描述类,加载静态文件,可使用@Value注解获取 | | @ComponentScan | 描述类,同XML的标签 |

三、Spring与JUnit4整合过程

  • Maven工程依赖Spring-test
  • 利用@RunWith(将Junit的执行权交由Spring Test,在测试用例执行前自动初始化IOC容器)与@ContextConfiguration(加载那个配置文件)描述测试用例类