IoC学习(Inverse of control)


Inverse of Control 创建对象的权限,Java 程序中需要用到的对象不再由程序员自己创建,而是交给 IoC 容器来创建。

当需求发生变更的时候,可能需要频繁修改 Java 代码,效率很低,如何解决?

使用静态工厂来创建特定的实现类,不再把代码写死在service中。

上述的方式并不能解决我们的问题,需求发生改变的时候,仍然需要修改代码,怎么做到不改 Java 代码,就可以实现实现类的切换呢?

使用反射

外部配置文件的方式

将具体的实现类写到配置文件中,Java 程序只需要读取配置文件即可。

Spring Ioc的使用

Spring boot采用基于注解的方式去实现配置,在构建ioc容器的时候,传入要扫描的包,ioc容器会自动将包中的类进行扫描,如果类上带有注解,则会认为是需要注入到ioc中,则会创建对象放到ioc容器中。

Ioc基于注解的执行原理

  1. 扫描包的组件:找出所有添加了注解的目标类。
  2. 获取原材料的组件:Class和beanName,先通过Class创建对象,用beanName标识对象存入cache。Ioc容器中有个BeanDefinitions集合专门用来封装Class和beanName。
  3. 根据原材料动态创建bean:根据BeanDefinitions创建bean对象存入到Ioc容器(k-v)中

手写代码的思路

1、自定义一个 MyAnnotationConfigApplicationContext,构造器中传入要扫描的包。

2、获取这个包下的所有类。

3、遍历这些类,找出添加了 @Component 注解的类,获取它的 Class 和对应的 beanName,封装成一个 BeanDefinition,存入集合 Set,这个机会就是 IoC 自动装载的原材料。

4、遍历 Set 集合,通过反射机制创建对象,同时检测属性有没有添加 @Value 注解,如果有还需要给属性赋值,再将这些动态创建的对象以 k-v 的形式存入缓存区。

5、提供 getBean 等方法,通过 beanName 取出对应的 bean 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值