Spring的IoC实现
软件开发原则:
-
OCP开闭原则【七大原则之一】,
-
对扩展开放,
-
对修改关闭;
因为一旦修改之前代码,就会每个单元都做单元测试;
-
-
DIP依赖倒置原则;
- 传统的是上层依赖下层【控制层依赖业务层,业务层依赖持久层】;
- 所以:依赖倒置是倡导面向接口,面向抽象编程【不依赖具体对象】;
-
IoC【控制反转思想】:不new具体的对象
- 反转:
- 不在程序中采取硬编码的方式New 对象;
- 不在程序中采取硬编码的方式维护对象关系;
- 因此,DI【依赖注入】是IoC思想的具体实现,
- new对象和维护对象关系交给Spring容器来实现;
- DI的两种方式:通过注入的方式【手段】来维护对象的依赖【关系】
- 构造方法注入;
- 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配置空间,是让配置可以复用;
- set()方法注入;
-
根据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方法上
- @Value,简单对象的维护【可以不提供set方法;】;

浙公网安备 33010602011771号