Spring Boot项目的入口类通常位于项目根包下,包含main
方法并通过@SpringBootApplication
注解标记。以下是典型启动类代码示例:
@SpringBootApplication
public class SpringLearnApplication {
public static void main(String[] args) {
SpringApplication.run(SpringLearnApplication.class, args);
}
}
核心注解说明:
@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。
@Configuration
:标记该类为配置类,替代XML配置@ComponentScan
:自动扫描当前包及子包的组件@EnableAutoConfiguration
:启用自动配置机制,加载spring.factories
中的配置类SpringApplication.run()
方法触发容器初始化流程:
META-INF/spring.factories
中的ApplicationContextInitializer
和ApplicationListener
public ConfigurableApplicationContext run(String... args) {
// 1. 启动计时器
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 2. 创建应用上下文(AnnotationConfigApplicationContext或Web类型)
ConfigurableApplicationContext context = createApplicationContext();
// 3. 准备环境配置
ConfigurableEnvironment environment = prepareEnvironment();
// 4. 执行refresh方法(核心!!!)
refreshContext(context);
// 5. 触发启动完成事件
callRunners(context.getBean(ApplicationRunner.class));
return context;
}
AbstractApplicationContext#refresh()
是Spring容器初始化的核心方法,共包含12个关键步骤:
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 步骤1:准备上下文环境
prepareRefresh();
// 步骤2:创建并配置BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 步骤3:BeanFactory预处理
prepareBeanFactory(beanFactory);
try {
// 步骤4:后置处理BeanFactory(空方法,供子类扩展)
postProcessBeanFactory(beanFactory);
// 步骤5:调用BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 步骤6:注册BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// 步骤7:初始化消息资源
initMessageSource();
// 步骤8:初始化事件广播器
initApplicationEventMulticaster();
// 步骤9:子类扩展刷新逻辑
onRefresh();
// 步骤10:注册监听器
registerListeners();
// 步骤11:完成Bean初始化
finishBeanFactoryInitialization(beanFactory);
// 步骤12:完成刷新,发布事件
finishRefresh();
}
// ... 异常处理
}
}
startupDate
earlyApplicationEvents
Environment
中的占位符)protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
BeanFactoryPostProcessor执行顺序:
ConfigurationClassPostProcessor
(处理@Configuration
类)PriorityOrdered
> Ordered
> 无顺序执行源码示例:
// 获取并排序BeanFactoryPostProcessor
List orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
注册所有BeanPostProcessor
,执行顺序同样遵循PriorityOrdered
> Ordered
> 无顺序。
重要子类处理器:
@PostConstruct
等JSR-250注解beanFactory.preInstantiateSingletons()
触发作用:在Bean定义加载完成后、实例化前修改BeanDefinition。
典型应用:
PropertySourcesPlaceholderConfigurer
:解析${}
占位符ConfigurationClassPostProcessor
:解析@Configuration
类中的@Bean
方法执行时机:
@PostConstruct
和InitializingBean
之前执行示例代码:
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
// 前置处理逻辑
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
// 后置处理逻辑(如AOP代理)
return wrapIfNecessary(bean, beanName);
}
}
publishEvent()
发布事件监听器注册示例:
@Component
public class RefreshListener implements ApplicationListener {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("容器初始化完成!");
}
}
@ComponentScan
的basePackages
属性限定路径exclude
属性禁用特定自动配置类通过深入理解refresh方法的每个步骤及处理器的作用,开发者能够更好地定制Spring容器的行为,优化应用启动性能,并实现复杂的业务需求。