Spring的IoC实现

软件开发原则:

  • OCP开闭原则【七大原则之一】,

    • 对扩展开放,

    • 对修改关闭;

      因为一旦修改之前代码,就会每个单元都做单元测试;

  • DIP依赖倒置原则;

    • 传统的是上层依赖下层【控制层依赖业务层,业务层依赖持久层】;
    • 所以:依赖倒置是倡导面向接口,面向抽象编程【不依赖具体对象】;
  • IoC【控制反转思想】:不new具体的对象

    • 反转:
      1. 不在程序中采取硬编码的方式New 对象;
      2. 不在程序中采取硬编码的方式维护对象关系;
    • 因此,DI【依赖注入】是IoC思想的具体实现,
      • new对象和维护对象关系交给Spring容器来实现;
      • DI的两种方式:通过注入的方式【手段】来维护对象的依赖【关系】
        1. 构造方法注入;
        2. set方法注入
  • Spring的创建对象:

    • 对象的创建:有的接口是在加载配置文件的时候创建【ClassPathXmlApplication】,有的时候在调用getBean()方法的时候【FileSystemXmlApplication】;

    • 通过反射,调用无参构造函数;

      Class<?> aClass = Class.forName(path);
      Object o = aClass.newInstance();
      
    • 通过map结构进行存储;

      • Map<String, Object> id,实例化对象;
      • id不存在时候,是出现error;
    • BeanFactory是IoC容器的最底层接口;

    • 因此IoC容器的实现:工厂模式 + 反射 + Xml解析;

  • Log4j2日志框架;

  • 依赖注入:

    • set()方法注入;
      • 先构造无参对象;
      • 属性中写入的是,set方法后面的字母,同时小写首个字母;
    • 构造方法注入;
      • 根据下标的参数注入:index = "0";
      • 根据变量名:name = "";
      • 根据类型,spring自动匹配;
    • set注入类型;
      • 外部Bean注入,通过ref注入;
      • 内部Bean注入,通过property内部新建bean,可以没有属性;
      • 简单类型的注入,通过value属性;
        • BeanUtils中有说明,哪些是简单类型;
      • 级联属性赋值;
        • 先get()方法获取对象,然后再set方法;
      • 数组属性注入;
        • 添加array属性,简单类型 value,对象类型 ref
      • 单列集合注入;
        • 添加list,set属性;
      • 双列集合注入;
        • 添加map,entry属性;
      • 注入特殊符号;
    • 基于p命名空间的注入,是简化基于set注入的配置;
    • 基于c命名空间的注入,是简化基于构造器的注入配置;
    • util配置空间,是让配置可以复用;
  • 根据xml的自动装配;

    • 添加属性,autowire;

    • 实际是根据set方法注入,所以,自动根据名子注入的时候,对应bean id会有一个set方法;

      相当于变量名就是id,而且有对应的set方法,所以根据名字自动注入,

    • 根据类型配置,相同原理,但是不能有多个相同类型的bean;

  • 引入外部配置文件【context命名空间】;

  • 单例和多例;

    • 默认是单例,添加scope属性,再加载配置文件的时候,生成对象;
    • 当为prototype 多例,在加载配置文件的时候,不会生成对象,而是懒汉模式,调用一次getBean方法,生成一个新对象;
    • request和session,仅web应用中;
  • 设计模式:工厂模式;

    • 是一种可以被重复利用的解决方案;
    • 设计模式【此外还有架构模式】,开发原则 ==> 高级语言的开发原则;
    • 创建模式【5】:解决创建对象的问题;
      • 单例模式;
      • 工厂模式;
        • 简单工厂【静态工厂方法模式】;
          • 抽象产品,具体产品,静态工厂;
          • 生产者和消费者分离了【责任链分离】;
          • 工厂负责所有生产,不符合开闭原则,而且一旦出现问题,则系统崩溃;
        • 工厂方法;
          • 抽象产品,具体产品,抽象工厂,具体工厂;
          • 符合OCP开闭原则;
          • 缺:新增产品,会增加具体产品和具体工厂【2个类】
        • 抽象工厂
      • 抽象工厂模式;
      • 建造者模式;
      • 原型模式;
    • 结构模式【7】:一些类和对象组合在一起的经典结构;
      • 代理模式;
      • 装饰模式;
      • 适配器模式;
      • 享元模式;
      • 外观模式;
      • 桥接模式;
    • 行为模式【11】:解决对象之间的交互问题;
      • 策略模式;
      • 模板方法模式;
      • 责任链模式;
      • 观察者模式;
      • 迭代子模式;
      • 命令模式;
      • 备忘录模式;
  • Bean的实例化【4种】;

    • 通过构造方法实例化【配置bean,反射】;
    • 通过简单工厂实例化【静态方法工厂,factory-method,会执行静态方法】;
      • class中是全类名,仅可调静态方法 factory-method,
      • factory-bean中是实例对象,可调实例方法 factory-method
    • 通过factory-bean 实例化【工厂方法】;
    • 通过FactoryBean接口实例化;
      • FactoryBean接口就是将工厂方法的配置,简化一个接口实现,当实现接口后,就可以按照一般对象配置获取对象;
  • FactoryBean和BeanFactory的区别

    • BeanFactory是一个Bean工厂,负责创建Bean对象【同时BeanFactory也是spring 容器的顶级接口】;
    • FactoryBean是一个工厂Bean,是一个特殊的bean对象,用来辅助闯其他Bean对象的创建【同时也存在一个FactoryBean接口,实现它,辅助创建其他Bean对象】;
  • 注解开发,简化配置开发;

    • @Component
    • @Controller
    • @Service
    • @Repository
    • 对象生成的四个注解配合注解扫描使用@ComponentScan:
    • 控制对应注解类实例化时,Component是可以控制其他三类;
  • 注解注入【两个对象关系的维护】;

    • @Value,简单对象的维护【可以不提供set方法;】;
      • 可以使用成员属性,set方法,构造方法;
    • @Autowired;
      • 没有value属性,支持属性,set方法,构造方法,构造参数;
      • 单独使用仅支持byType自动注入;
      • 类型必须只有一个;
      • 可以配个@qualifier使用,支持名字使用,单独使用@qualifier没有作用;
    • @Resource【官方推荐,jdk】;
      • 优先使用byName装配,没有提供则使用属性名,最后使用byType【类型有多个实现的时候,会报错】进行注入;
      • 支持属性和set方法上
posted @ 2025-05-31 18:59  烟雨断桥  阅读(16)  评论(0)    收藏  举报