spring启动流程
AbstractApplicationContext
构造好beanFactory后遍历每个定义的bean,如果需要生成实例就生成实例
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
// Initialize conversion service for this context.
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}
// Stop using the temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(null);
// Allow for caching all bean definition metadata, not expecting further changes.
beanFactory.freezeConfiguration();
// Instantiate all remaining (non-lazy-init) singletons.
beanFactory.preInstantiateSingletons();
}
实例化可以实例化的bean(Singleton并且不是LazyInit),由于绝大多数bean都是Singleton(默认)的,所以项目启动时会实例化很多对象,实现ApplicationContextAware接口的bean会在实例化时将ApplicationContext设置进去,这样就可以在类内部直接方法spring的上下文了。
DefaultListableBeanFactory
public void preInstantiateSingletons() throws BeansException {
if (this.logger.isInfoEnabled()) {
this.logger.info("Pre-instantiating singletons in " + this);
}
synchronized (this.beanDefinitionMap) {
List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
final FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
public Boolean run() {
return ((SmartFactoryBean) factory).isEagerInit();
}
}, getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
else {
getBean(beanName);
}
}
}
}
}
相关推荐
源码分析会涉及SpringBoot的启动流程,包括`SpringApplication.run()`方法的执行细节,自动配置的实现机制,以及如何通过条件注解选择合适的bean。理解这些将帮助你自定义启动配置,优化项目结构。 接着,进入...
Spring Boot 2.2.2 启动过程源码分析,SpringApplication 实例 run 方法运行过程,.分析了 SpringApplication 实例对象构造方法初始化过程,下面继续来看下这个 SpringApplication 对象的 run 方法的源码和运行流程。
SpringBoot 启动过程源码分析 SpringBoot 的启动原理是基于 JavaConfig 形式的配置,使用 @Configuration 注解标注的启动类来配置 IoC 容器。@SpringBootApplication 注解是 SpringBoot 的核心注解,它包括了三个...
以上只是Spring源码分析的部分内容,实际源码中还包括Spring的其他模块,如Spring Batch(批处理)、Spring Security(安全)、Spring Integration(集成)等。理解并掌握Spring源码,有助于我们更好地利用Spring...
在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...
《Spring高级源码分析》是针对Java开发人员深入理解Spring框架的一份宝贵资源。Spring作为Java企业级应用的基石,其强大的功能和灵活性源于其深厚的设计理念和精巧的源码实现。本分析将深入探讨Spring的核心机制,...
5. **源码分析**: 在`ProxyFactoryBean`的`getObject()`方法中,会调用`createAopProxy()`生成`AopProxy`,然后`AopProxy`的`getProxy()`方法返回实际的代理对象。`createAopProxy()`会根据配置判断使用JDK还是...
3. **Spring Boot**:Spring Boot简化了Spring应用的启动和配置过程。源码中包含的Spring Boot项目展示了自动配置、起步依赖和Actuator等特性。 4. **Spring Data**:Spring Data为各种持久化技术(如JPA、MongoDB...
源码分析是理解Spring工作原理的关键,能帮助开发者深入掌握如何在实际项目中有效地使用和优化Spring。下面将对Spring框架的核心组件、设计理念以及源码中的关键部分进行详细的解释。 1. **依赖注入(DI)** - ...
通过对Spring Data Elasticsearch 2.1.10.RELEASE的源码分析,我们可以深入了解其工作原理,从而更好地利用这一工具。 首先,Spring Data Elasticsearch的核心理念是提供一个统一的编程模型,让开发者能以声明式的...
它简化了Spring应用的初始搭建以及运行过程,通过自动配置和起步依赖,让开发者能够快速启动项目。 7. **Spring Data** Spring Data项目提供了一种统一的方式来访问各种数据存储,包括JPA、MongoDB、Cassandra等。...
3. **父子容器启动原理**:在"17-SpringMVC源码—父子容器启动原理深入剖析-徐庶"中,我们将揭示Spring MVC如何构建父子容器,并解释容器的启动流程。理解这一过程有助于我们优化应用的初始化性能,合理设计Bean的...
SpringBoot_SpringSecurity-源码.zip 这个压缩包文件主要包含了SpringBoot集成SpringSecurity的源码分析。SpringBoot是Java开发中一个流行的轻量级框架,它简化了配置和应用部署,使得开发者可以快速搭建应用程序。...
7. **源码分析** 分析Spring源码有助于深入理解其动态代理的工作原理。例如,可以查看`org.springframework.aop.framework.JdkDynamicAopProxy`和`org.springframework.aop.framework.CglibAopProxy`这两个类,它们...
7. **源码分析**:深入理解这些组件的源码,可以帮助开发者更好地了解其工作原理,从而优化微服务架构,提高系统的性能和稳定性。例如,通过阅读Eureka的源码,可以了解到服务注册、心跳机制、服务健康检查等核心...
总之,`Spring-5.1.5源码`的分析涵盖了Spring框架在Web应用中的核心功能,包括初始化、配置加载、依赖注入、AOP、异常处理以及现代化Web技术的支持。深入理解这些知识点,对于提升Spring框架的使用技巧和开发效率...
8. **Spring Boot**:Spring Boot简化了Spring应用的初始搭建和配置过程,采用“约定优于配置”的原则,提供了一种快速启动和运行Spring应用的方式。 9. **Spring Security**:Spring的安全模块,用于身份验证和...
### Spring 源码分析——设计模式篇 #### 一、引言 Spring框架作为Java企业级开发领域中不可或缺的一部分,其内部集成了多种设计模式,不仅有助于提高系统的可维护性和扩展性,还能够帮助开发者更好地理解和应用...
在源码分析中,我们可以看到当一个方法被@Transactional标记后,Spring会创建一个代理,这个代理在目标方法执行前后插入事务管理逻辑。在方法开始前,如果满足事务启动条件,就会调用`PlatformTransactionManager`的...