一、Spring的特征
  1. 非侵入式: 用这个框架,不会给你项目原本的代码增加什么东西(对你的代码几乎没有任何改动), 该框架基本上是以注解、配置文件的方式使用在项目中的。
  2. 控制反转: IOC(后面重点学习)
  3. 面向切面编程: AOP(后面重点学习)
  4. 容器: IOC容器,Spring开发所有功能都是基于IOC容器,屏蔽对象的创建细节,让程序员只关注对象的使用
  5. 组件化:Spring可以通过IOC和依赖注入的方式将各个功能组件组合起来,共同搭建完成一个大型复杂应用,并且 还能够尽量降低组件与组件间的耦合。
  6. 声明式: 其实就是让我们通过配置或者注解来完成一些功能,而不需要通过编写代码来完成这些功能。
  7. 一站式: Spring Framework可以整合市面上各种优秀的第三方框架,从而降低那些第三方框架的使用成本。
二、Spring的五大功能模块
  1. Test: Spring对单元测试的支持,可以整合Junit从而降低单元测试的使用成本
  2. Core Container: 核心容器,它的主要体现是在IOC和依赖注入功能中。
  3. AOP: 面向切面编程
  4. Web: SpringMVC,用在表现层的技术
  5. Data Access: Spring对持久层技术的支持,包含JdbcTemplate、事务管理等等
三、IOC容器
  1. 什么是容器? 在Java中,容器就是用于存放/管理数据的一块内存空间
  2. 容器的分类 2.1 普通容器:只能存放数据、删除数据、向外提供数据的容器,例如: List、数组、Map等等 2.2 复杂容器:它不仅能存放数据、删除数据、向外提供数据,还能自己创建容器中的对象、管理对象的生命周期、销毁对象等等一些操作。 例如: Tomcat就是一种复杂容器,Tomcat不仅能够存放Servlet、Filter、Listener对象,还能够创建这些对象、管理这些对象 的生命周期、在不同的生命周期调用它们不同的方法进行处理、销毁这些对象等等。
  3. IOC的概念: inversion of control,控制反转。将对象的创建权反转交给IOC容器,由IOC容器创建对象,对象的使用者只需要从IOC容器中 获取他想要的对象,并加以使用就行了。
  4. IOC的优势: 4.1 屏蔽对象创建的细节,对象的使用者不再是对象的创建者,不用再去关注对象的创建细节 4.2 降低程序的耦合度
  5. IOC容器的实现方案: 5.1 BeanFactory: 这种方案一般是Spring内部使用的,Spring框架的内部功能使用IOC容器的话,用的是BeanFactory实现的
    5.2 ApplicationContext: 它是BeanFactory的子接口,它的功能比BeanFactory更丰富一些,面向Spring的使用者
  6. ApplicationContext接口的具体的实现类: 6.1 ClassPathXmlApplicationContext: 读取类路径下的xml配置文件,从而创建IOC容器对象 6.2 FileSystemXmlApplicationContext: 读取文件系统中任意路径下的xml配置文件,从而创建IOC容器 6.3 AnnotationConfigApplicationContext: 读取配置类,从而创建IOC容器,主要用在纯注解开发的Spring项目中 6.4 WebApplicationContext: 为Web工程(SpringMVC)提供的IOC容器
四、SpringIOC的快速入门
  1. 目标: 1.1 由IOC容器读取类路径下的xml配置文件,创建出HappyComponent类的对象 1.2 使用者从IOC容器中获取HappyComponent类的对象
  2. 实现步骤: 2.1 引入依赖 2.2 在类路径下创建spring的配置文件,编写ioc 2.3 创建IOC容器,让其读取类路径下的spring配置文件 2.4 从IOC容器中获取HappyComponent对象,并使用该对象
五、依赖注入
  1. 依赖注入的概念: 1.1 Spring在进行IOC创建的对象,主动给对象的成员变量赋值。 1.2 IOC容器识别到你需要这个对象,它主动将容器中的该对象给你。
  2. 依赖注入的意义 2.1 降低编译期耦合 2.2 让IOC容器统一管理项目中的对象 2.3 解决硬编码问题
  3. 依赖注入的方式: 3.1 set方法进行注入: 需要注入的属性有对应的set方法,使用property标签(name属性对应set方法) 3.1.1 注入简单类型的属性: 3.1.1.1 使用value属性 3.1.1.2 可以引入外部的properties文件,获取文件中的内容 3.1.2 注入Bean类型的属性: 3.1.2.1 IOC容器中有要被注入的Bean类型的对象,就使用ref引用该对象的id 3.1.2.2 如果IOC容器中没有要被注入的Bean类型的对象,我们可以注入内部Bean 3.2 有参构造函数的方式进行依赖注入(了解)
  4. 自动装配 4.1 什么是自动装配? 我们不主动通过标签或者p命名空间告知IOC容器要调用哪个set方法,而是由IOC容器自动调用set方法设置值
    4.2 自动装配的分类: 4.2.1 byType: 按照类型自动装配,例如UserController中有一个setUserService()方法,需要接收UserService, 如果IOC容器中有且只有一个UserService类型的对象就将其装配进来。 4.2.2 byName: 按照名称唯一标识自动装配,根据对象的id匹配对应的set方法
五、Bean的作用范围
  1. 什么是Bean? 所有由Spring的IOC容器管理的对象都叫Bean
  2. Bean的作用范围: 2.1 singleTon单例(默认): 在创建IOC容器的时候,就初始化Bean,将Bean存储到IOC容器中,使用者从容器 获取Bean的时候,指向容器中的Bean对象 2.2 prototype多例: 在容器调用getBean()方法获取Bean的时候才创建Bean,并且每次调用getBean()方法都会重新创建Bean, 所以创建出来的Bean,不会存储在IOC容器中的。
六、Bean的生命周期
  1. 创建Bean: 调用构造函数创建Bean对象 1.1 如果是单例Bean: 在创建IOC容器的时候创建Bean 1.2 如果是多例: 在调用getBean()方法的时候创建Bean
  2. 给Bean设置属性(依赖注入):调用set方法
  3. 由后置处理器的前置处理方法,执行Bean初始化之前的操作 Bean的后置处理器是作用在Bean的初始化前后,后置处理器中的前置处理方法是作用在Bean初始化之前。
  4. Bean初始化,调用Bean的初始化方法
  5. Bean的后置处理器的后置处理方法,执行Bean初始化之后的操作
  6. Bean准备就绪,我们就可以使用Bean
  7. Bean的销毁(给Bean指定一个销毁方法) 7.1 单例Bean: 随着IOC容器的关闭而销毁 7.2 多例Bean: 随着JVM的垃圾回收而销毁
七、FactoryBean机制
  1. 普通Bean机制IOC创建来的就是它自己的对象
  2. FactoryBean机制创建出来的是它的getObject()方法返回的对象