文章目录
Inverse of Control 创建对象的权限,Java 程序中需要用到的对象不再由程序员自己创建,而是交给 IoC 容器来创建。
当需求发生变更的时候,可能需要频繁修改 Java 代码,效率很低,如何解决?
使用静态工厂来创建特定的实现类,不再把代码写死在service中。
上述的方式并不能解决我们的问题,需求发生改变的时候,仍然需要修改代码,怎么做到不改 Java 代码,就可以实现实现类的切换呢?
使用反射
外部配置文件的方式
将具体的实现类写到配置文件中,Java 程序只需要读取配置文件即可。
Spring Ioc的使用
Spring boot采用基于注解的方式去实现配置,在构建ioc容器的时候,传入要扫描的包,ioc容器会自动将包中的类进行扫描,如果类上带有注解,则会认为是需要注入到ioc中,则会创建对象放到ioc容器中。
Ioc基于注解的执行原理
- 扫描包的组件:找出所有添加了注解的目标类。
- 获取原材料的组件:Class和beanName,先通过Class创建对象,用beanName标识对象存入cache。Ioc容器中有个BeanDefinitions集合专门用来封装Class和beanName。
- 根据原材料动态创建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 即可。