Spring IOC(Inversion of Control,控制反转)是 Spring 框架的核心功能之一,通过 ** 依赖注入(Dependency Injection)** 实现对象的创建和管理。IOC 容器的主要职责包括:
Spring 提供了多种 IOC 容器实现,其中最核心的是 BeanFactory
和 ApplicationContext
。
public interface BeanFactory {
Object getBean(String name) throws BeansException;
T getBean(String name, Class requiredType) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
// 其他方法...
}
BeanFactory
的子接口,扩展了企业级功能(如事件发布、国际化支持等)。BeanDefinition
的接口。classpath:applicationContext.xml
)或配置类(如 @Configuration
类)定位资源。ResourceLoader
将配置资源加载为 Resource
对象。// 示例:使用 ClassPathXmlApplicationContext 加载资源
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanDefinitionDocumentReader
解析 XML 文件,生成 BeanDefinition
。ClassPathBeanDefinitionScanner
扫描带 @Component
、@Service
等注解的类,生成 BeanDefinition
。BeanDefinition
注册到 BeanDefinitionRegistry
(通常是 DefaultListableBeanFactory
)。DefaultListableBeanFactory
。BeanPostProcessor
接口的 Bean,用于在 Bean 初始化前后进行自定义处理。BeanFactoryPostProcessor
接口的 Bean,允许在 Bean 实例化前修改 BeanDefinition
。
PropertySourcesPlaceholderConfigurer
(解析配置文件中的占位符)。AutowiredAnnotationBeanPostProcessor
处理 @Autowired
、@Inject
注解。@Autowired
、@Resource
等注解,完成依赖注入。BeanPostProcessor
的 postProcessBeforeInitialization
方法。InitializingBean
接口的 afterPropertiesSet()
方法。@PostConstruct
或 XML 的 init-method
属性)。BeanPostProcessor
的 postProcessAfterInitialization
方法(如 AOP 代理在此阶段生成)。ContextRefreshedEvent
通知容器已初始化完成。Lifecycle
接口的 Bean 的 start()
方法。refresh()
方法是容器初始化的核心入口,包含了完整的初始化流程:
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 准备刷新环境
prepareRefresh();
// 获取 BeanFactory(通常是 DefaultListableBeanFactory)
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 准备 BeanFactory
prepareBeanFactory(beanFactory);
try {
// 允许子类对 BeanFactory 进行后置处理
postProcessBeanFactory(beanFactory);
// 调用 BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 注册 BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// 初始化消息源(国际化支持)
initMessageSource();
// 初始化事件广播器
initApplicationEventMulticaster();
// 子类可重写此方法进行额外处理
onRefresh();
// 注册监听器
registerListeners();
// 实例化所有剩余的单例 Bean
finishBeanFactoryInitialization(beanFactory);
// 完成刷新,发布事件
finishRefresh();
}
catch (BeansException ex) {
// 异常处理...
}
finally {
// 重置公共缓存
resetCommonCaches();
}
}
}
// AbstractAutowireCapableBeanFactory#createBean()
@Override
protected Object createBean(String beanName, BeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// 解析 Bean 的类
resolveBeanClass(mbd, beanName);
// 准备方法覆盖(处理 lookup-method 和 replace-method)
prepareMethodOverrides(mbd, beanName);
try {
// 让 BeanPostProcessor 有机会提前创建代理
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
// 实际创建 Bean
return doCreateBean(beanName, mbdToUse, args);
}
// AbstractAutowireCapableBeanFactory#doCreateBean()
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// 创建 Bean 实例(通过构造函数或工厂方法)
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
// 处理合并后的 BeanDefinition
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
// 处理循环依赖(提前暴露半成品 Bean)
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// 填充 Bean 属性(依赖注入)
populateBean(beanName, mbd, instanceWrapper);
// 初始化 Bean(调用初始化方法和 BeanPostProcessor)
exposedObject = initializeBean(beanName, exposedObject, mbd);
// 处理循环依赖相关逻辑
if (earlySingletonExposure) {
// ...
}
// 注册 DisposableBean(用于销毁回调)
registerDisposableBeanIfNecessary(beanName, bean, mbd);
return exposedObject;
}
通过 @Lazy
注解或 XML 的 lazy-init="true"
属性,可延迟 Bean 的初始化到首次使用时:
@Bean
@Lazy
public MyService myService() {
return new MyService();
}
通过实现 BeanFactoryPostProcessor
,可在 Bean 实例化前修改 BeanDefinition
:
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bd = beanFactory.getBeanDefinition("myBean");
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
}
}
通过实现 BeanPostProcessor
,可在 Bean 初始化前后进行自定义处理(如 AOP 代理):
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在初始化前处理
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 在初始化后处理(如生成代理)
return bean;
}
}
@Lazy
延迟加载。@DependsOn
注解指定依赖关系。InitializingBean
或 @PostConstruct
进行初始化逻辑。org.springframework
日志级别为 DEBUG,查看详细初始化过程。Spring IOC 容器的初始化是一个复杂的过程,涉及资源加载、BeanDefinition 解析、依赖注入和生命周期管理等多个阶段。理解其核心流程有助于:
BeanFactoryPostProcessor
和 BeanPostProcessor
扩展容器功能。掌握 IOC 容器的初始化流程是深入理解 Spring 框架的关键一步,也是开发高效、稳定的 Spring 应用的基础。