Spring框架的基本概念与IOC学习笔记

Spring框架


Spring的概述

1. Spring的概念:
* spring是一个全栈式的轻量级开源框架,以IOC(控制反转)和AOP(面向切面编程)为内核
* 全栈式:
2. Spring家族:
1. Spring Framework
2. SpringBoot
3. SpringData
4. SpringSecurity
5. SpringCloud
3. Spring 的优势
1. 方便解耦,简化开发
2. AOP编程的支持
3. 申明式事务的支持
4. 方便程序的测试
5. 方便集成各种优秀的框架
6. 降低JavaEE API的使用难度
7. Java源码是经典学习范例—>可以学习一下
4. 代码的耦合(程序间的依赖关系)/解耦(降低程序间的依赖)
编译期依赖:

  • 解耦的思路(转换成运行时依赖):工厂模式+配置文件+反射
1. 使用反射创建对象,避免使用new关键字
2. 通过配置文件来获取要创建对象的全限定类名
3. 使用工厂模式创建对象
    1. 由于每次调用工厂模式都会创建一个新对象-->浪费资源,降低开发效率
    2. 我们需要创建一个单例模式的对象
        * 定义一个map集合保存创建的对象(该对象可以在类加载的时候创建)
        * 通过工厂模式获取对象时,可以从map集合中获取
        * 


Spring IOC(Inversion Of Control)

1. 概念:
1. IOC(Inversion Of Control):控制反转
2. 把创建对象的权力交给框架
3. 可以解决程序中的耦合
2. IOC入门

  1. 开发包文件说明
    1. docs:文档
    2. libs:jar包
    3. scheme:约束文件
  2. 环境搭建
    1. pom.xml 引入依赖jar包—>Spring-context
    2. 配置文件
      1. 加入约束
      2. 配置
        <bean id="唯一标识" class="全限定类名">
    3. 初始化Spring(IOC)容器
      • ApplicationContext context = new ClassPathXmlApplicationContext(“配置文件”);
        • context.getBean(“id”);
        • context.getBean(“id”,Class)
        • context.getBean(class)
  3. ApplicationContext 常用实现类
    1. ClassPathXmlApplicationContext
      可以加载类路径的下的配置文件
    2. FileSystemXmlApplicationContext
      可以加载有权限的磁盘路径下的配置文件
    3. AnnotationConfigApplicationContext
      可以读取注解创建
  4. ApplicationContext 与 BeanFactory接口的关系
    1. 联系:BeanFactory是ApplicationContext的顶层父接口
    2. 区别:创建对象的时机不同
      1. ApplicationContext : 单例对象适用
        1. 创建对象采取的策略是立即加载的方式,配置文件读取完就创建对象
        2. 功能强大
      2. BeaFactory : 多例对象使用
        创建对象采取的策略是延迟加载的方式,使用对象时才会创建对象

3. bean对象的实例化

  1. 创建bean的三种方式
    1. 使用默认构造函数实例化
    2. 实例工厂方法实例化(使用某个类中的方法创建,并存入spring容器)

    3. 静态工厂方法实例化
  2. bean的作用范围
    1. 默认情况下,Spring容器中配置的bean是单例的
    2. 通过bean标签的scope属性可以调整bean的作用范围
      1. singleton : 单例
      2. prototype : 多例
      3. request : 作用于web应用的请求范围
      4. session : 作用于web应用的会话范围
      5. global-session : 作用于集群环境的会话范围,当不是集群环境时,等同于session
  3. bean对象的生命周期
    bean初始化的方法 : init-method
    bean销毁的方法 : destroy-method
    1. 单例对象:单例对象的生命周期与spring容器相同
    2. 多例对象:当对象使用时创建,由java垃圾回收机制回收

4. Spring-DI(依赖注入)

  1. 什么是依赖注入?
    英文全称: Depedency Injection
    在当前类需要用到其他类的对象,由spring提供,需要在配置文件中说明依赖关系的维护–称为依赖注入
  2. 注入的数据类型
    1. 基本类型和String
    2. 其他bean类型
    3. 复杂类型/集合类型
  3. 注入的方式
    • 经常变化的数据,不适合注入的方式
    1. 构造函数注入
      • 使用的标签:
      • 使用的位置: 标签内
      • 标签中的属性:
        • type : 构造参数的类型
        • index :构造参数的索引
        • name :构造参数的名称
        • value : 注入的数据,简单数据类型
        • ref : 注入的数据,是spring容器中声明的bean类型
    2. setter注入
      • 必须提供set方法
      • 使用的标签: <property>
      • 使用的位置:<bean>标签内
      • 标签的属性:
        • name:被注入对象的属性名–定位要调用的set方法
        • value:注入的数据,简单数据类型
        • ref : 注入的数据,是spring容器中声明的bean类型
      • 集合类型的注入
        • 使用的标签 :
          • list结构使用的标签(组内间可以互用)
            • <array>—注入数组使用
            • <list>----注入集合使用
            • <set>-----注入set使用
          • map结构使用的标签(组内间可以互用)
            • <map>-----注入map使用
            • <props>—注入properties使用
    3. 注解注入

5. IOC的半注解开发
使用注解开发,需要配置xml
配置包扫描路径—>告知spring容器,在加载配置文件时,扫描那个包下的注解
步骤:

  1. 引入context约束
  2. 配置包扫描路径
    <context:component-scan base-package=“包路径”>
    1. 用于创建对象的注解
      @Component:
      作用:用于把当前类的对象保存到容器中
      属性:
      1. 如果不指定属性,键值默认类名首字母小写
      2. 使用value指定键值
      衍生的注解:
      1. @Controller:一般用在表现层
      2. @Service: 一般用在业务层
      3. @Repository:一般用在持久层
      以上三个功能与@Component基本相同
    2. 用于注入数据的注解
      1. @Autowired
      • 作用: 自动按照类型注入,

        • 如果ioc容器中有唯一的数据匹配,可以注入成功,
        • 如果ioc容器中没有匹配的数据,会报错 NoSuchBeanDefinitionException
        • 如果ioc容器中有多个匹配的数据,会报错(NoUniqueBeanDefinitionException)
          解决方案:
          > 可以通过变量名匹配对应对象
          > @Qualifier,按照类型注入的前提下再按照名称注入,在给成员注入时不能单独使用
          > @Resource,可以直接通过name属性指定bean的id–>JDK1.9失效
      • 作用位置: 方法上,类上

      • 以上三个注解都只能注入bean类型的数据,简单数据类型不能使用以上注解,另外集合类性只能通过xml来实现

      1. @Value
        • 作用: 用于注入基本类型和String类型的数据
        • 属性:
          value:用于指定数据的值,它可以使用spring中的SpEL(Spring的EL表达式:${表达式})
    3. 用于改变作用范围的注解
      @Scope:
      • 作用:指定bean的作用范围
    4. 和生命周期相关的注解
    * @PostConstruct : 初始化注解
    * @PreDestroy : 销毁注解
    

6. IOC的案例
xml-IOC配置
Spring框架的基本概念与IOC学习笔记
Spring的全注解配置

  1. @Configuration :

    作用: 指定当前类是一个配置类
    细节: 当配置类作为AnnotationConfigApplicationContext的参数时,可以省略

  2. @ComponentScan :指定spring在创建容器中要扫描的包

    value/basePackages属性指定要扫描的包

  3. @Bean :

    作用: 用于把当前方法的返回值作为bean对象传入spring容器中
    作用位置: 方法上
    属性: name用于指定bean的id,当没有指定name值时,默认id是当前方法名称
    细节: 当使用注解配置时,在方法声明时,指定了方法的形参,参数需要去ioc容器中查找,查找方式与@Autowired相似

  4. @Import

    作用 :用于导入其他配置类
    属性 : value:用于指定其他配置类的字节码对象
    当配置类被@Import注解时,该配置类就是主(父)配置类,

  5. @PropertySource
    Spring框架的基本概念与IOC学习笔记

    作用 : 加载外部properties配置文件
    属性 :
    value:指定文件的名称和路径
    1. classpath:申明value中的路径是类路径的关键字
    2. file:申明value中的路径是file目录的关

  6. @Qulifier

    作用 : 作用在方法的形参上面,指定注入参数的id值

Spring对Junit的整合

  1. 导入Spring整合junit的jar包–>spring-test.jar

  2. 使用Junit提供的@Runwith注解将原有的main方法替换成spring提供的SpringJunit4ClassRunner

  3. 通过@ContextConfiguration注解告知spring的运行器,spring和ioc时基于xml还是注解,并说明位置

    locations: 指定xml文件的位置,加上classpaht关键字,表示在类路径下

    • @ContextConfiguration(locations=“classpath:配置文件”)

    classes: 指定注解类所在位置,指定配置类的字节码对象

    • @ContextConfiguration(classes=“配置类字节码对象”)
  4. Spring-test如果版本时5.0以上,junit的jar包版本必须高于4.12