IOC又叫依赖注入,Spring的依赖主要由ApplicationContext这个高级容器来实现的
我说下大体流程吧,Spring容器启动时,beanDefinitionReader读取配置文件,然后交由BeanFactory也就是Bean工厂组装成,转换为完整的的Beandefinition,最后再放到BeanFactory的单例池中,底层是一个ConcurrentHashMap的实现;
IoC 的核心流程
1.配置解析:将 XML/注解转换为 BeanDefinition和beanFactory
1
2
3
4
5
6// 初始化容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
public interface BeanFactory {
//获取 判断bean类型 是否存在 单例等方法
}2.实例化:反射创建对象,处理作用域(单例/多例)。
1
2
3
4
5
6
7
8
9protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) {
// 实例化对象(通过反射或无参构造器)
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
// 属性注入(依赖注入)
populateBean(beanName, mbd, instanceWrapper);
// 初始化(调用 init-method)
initializeBean(beanName, instanceWrapper.getWrappedInstance(), mbd);
return instanceWrapper.getWrappedInstance();
}反射实例化:通过 BeanUtils.instantiateClass() 反射创建对象。
3.依赖注入:通过 Setter 或构造函数注入属性值。
Setter 注入:调用 populateBean(),解析标签,通过反射设置属性值。
构造函数注入:解析,匹配参数类型并调用构造器 4.生命周期管理:调用初始化方法及扩展点(如 BeanPostProcessor)。
5.代理生成:按需创建动态代理对象(AOP 场景)