对于Spring Bean 的初始化归纳了下,主要可以归纳一下三种方式 @PostConstruct 标注方法 自定义初始化方法 实现 initializingBean 接口的afterPropertiesSet......"); } } 简单进行容器创建->装置配置->启动应用上下文..依赖查找Bean @Configurable public class BeanInitializationDemo {...应用上下文 applicationContext.close(); System.out.println("Spring 应用上下文已关闭..."); } @Bean...二、自定义初始化方法 自定义初始化方法大致可分为三种实现 XML 配置: Java 注解:@Bean(initMethod=”init”)...归纳 上面三种方式案例分别介绍了PostConstruct、initializingBean以及自定义Bean初始化的方法;从执行结果可以看出,他们的执行顺序是有一定的要求的。
,今天我们来看了解一下Spring一个Bean的加载。 init-method方法 init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。...在初始化的时候会执行TestBean中定义的init方法。...,然后对所有的bean进行一个初始化之前和之后的代理。...postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。...BeanPostProcessor处理器的使用 先看一下BeanPostProcessor接口的源码,它定义了两个方法,一个在bean初始化之前,一个在bean初始化之后 public interface
从这个简单的代码深入,使用AnnotationConfigApplicationContext看一下spring bean的初始化过程 public static void main(String[]...bean创建 第一个方法进入AnnotationConfigApplicationContext的构造函数 public AnnotationConfigApplicationContext() {
前面提到过Bean的初始化方式,在Bean 的配置元信息时候我们知道Bean的元信息配置中有lazy-init 延迟初始化属性配置,延迟初始化Spring Bean 还有Java 注解API的方式实现...它的意思就是:它会去初始化或者是实例化我们所有的非延迟初始化的一个单体类或者单体Bean 进入方法里面又可以发现 // Instantiate all remaining (non-lazy-init...,普通的Bean在这里初始化 ,部分Bean是需要我们内部容器自己做初始化 。...,另一个在应用上下文启动之后 源码地址: https://gitee.com/iByteCoding/thinking-in-spring 往期推荐 初始化Spring Bean:Bean初始化有哪些方式...注册Spring Bean:如何将BeanDefinition注册到IoC容器? 定义Bean:什么是BeanDefinition?
initialization 和 destroy 有时需要在 Bean 属性值 set 好之后和 Bean 销毁之前做一些事情,比如检查 Bean 中某个属性是否被正常的设置好值。...() 方法可以在销毁Bean之前做一些操作。...在 bean 的配置文件中指定 init-method 和 destroy-method 方法 Spring 允许我们创建自己的 init 方法和 destroy 方法,只要在 Bean 的配置文件中指定...init-method 和 destroy-method 的值就可以在 Bean 初始化时和销毁之前执行一些操作。...throws Exception { System.out.println("执行配置的 destroy-method"); } // 通过 init-method 属性指定的初始化方法
我们通过spring容器帮我们实例化并且维护bean的时候,有时候我们需要在bean在实例化完成的时候,帮我们做一些事情,这个时候我们就会使用到bean的初始化方法。...我们这里分析的三个初始化方法如下,如果已经比较了解如何使用以及原理,可以跳过该文章 1.实现InitializingBean接口 2.使用@PostConstruct 3.使用@Bean(initMethod...这里就不再介绍bean创建的全过程了,如果感兴趣的可以参考我这篇文章(spring源码分析之如何解决循环依赖),这篇文章写的比较详细,我们直接从bean创建后,开始初始化的地方开始介绍 //AbstractAutowireCapableBeanFactory.java..., mbd); } } } 注释1通过实现InitializingBean方式来实现初始化的非常的简单,不做过多的介绍,注释2通过@Bean的方式稍微介绍一下。...bean创建的过程都是先封装成beanDefinition,如果这一块不了解的可以先阅读相关文章 上面我们已经知道InitializingBean和@Bean(initMethod=“xx”)来实现初始化方法的原理
在Spring Boot:定制自己的starter一文提到,只要DbCountRunner这个类在classpath路径下,Spring Boot会自动创建对应的spring bean并添加到应用程序上下文中...在文章最后提到,Spring Boot的自动配置机制依靠@ConditionalOnMissingBean注解判断是否执行初始化代码,即如果用户已经创建了bean,则相关的初始化代码不再执行。...DbCountAutoConfiguration的自动配置信息 在BookPubApplication类中定义DbCountRunner的spring bean @Bean public DbCountRunner...DbCountRunner"); } }; } 再次运行程序,观察结果,可以看到这个配置信息放在Negative matchs组中,显示判断条件不匹配,因为已经找到dbCountRunner这个bean...手动配置的Bean优先 ? 修改后的日志信息,显示手动配置bean
前言 前面两篇文章主要介绍的是xml到BeanDefinition的过程,我们知道在使用Spring的过程中通常直接使用getBean(beanName)的方式,getBean返回的是实例化并且已经完成初始化后的对象...抽丝剥茧出主干也就是: 根据BeanDefinition的信息找到对象构造器,实例化对象 根据BeanDefinition的信息找到属性值,填充之 如果有初始化方法,调用初始化方法 当然上述主干主要讲的是非单例对象...创建过程中提供的扩展点及事件监听 Spring的initiation过程及一种并行初始化的实现。...在getSingleton(beanName, singletonFactory)方法中会调用getObject(),实际上也就是调用了createBean,bean的创建实际上是从这个地方开始的。..., mbd); } 抽去一些不太重要的代码只有,整个逻辑非常清楚,首先createBeanInstance创建对象,然后填充对象populateBean,最后调用初始化方法initializeBean,
0x01:通过在Bean中定义init-method 和 destory-method方法 public class Car { public Car() { System.out.println...Car's Init..."); } public void destory(){ System.out.println("Car's Destroy..."); } } @Bean...destroyMethod = "destory") public Car car(){ return new Car(); } 0x02: 通过@PostConstruct和@PreDestroy方法实现初始化和销毁...bean之前进行的操作 import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @Service public...Customer clean up"); } } 这两个注解是JDK自带的,因此与Spring的耦合性较低(必须要Spring扫描到这个java类才能执行使用该注解的方法) 0x03: 通过bean
说明bean初始化的核心方法在该方法中。 // ......bean初始化的方法在getBean(beanName)中。...(2)判断是否bean处于正在初始化中,这个条件主要是为了循环依赖使用,循环依赖情况下,可能存在bean正在创建中的情况。这种情况今天的初始化过程先不涉及。...此时的testSerivce还不是bean,也可以使用指定testService的初始化方法来观察,有没有执行bean的初始化方法。 ?...singletonObject : null); } } 五、普通bean的初始化过程-总结 以上就是普通spring bean的初始化过程,跟着debug阅读bean的初始化过程其实并不复杂
spring bean 加载耗时分析 分析bean加载耗时 首先需要分析加载耗时高的bean。...可以看下这些bean的特点,大部分都是在afterPropertiesSet,postconstruct,init方法中有初始化逻辑 eg....AgentConfig中有个构建bean,并调用init方法初始化。...但这个类的初始化顺序不是固定的,在不同机器上表现形式不一样。...的加载顺序为 调用对象的构造函数 为对象注入依赖,执行依赖对象的初始化过程 执行PostConstruct,afterPropertiesSet等生命周期方法。
前言 大家好,我是java小面,今天我们继续前面Spring文章比较核心的Bean内容的探讨,这次来探讨的是关于延迟初始化Bean是否会影响到依赖注入的问题,依赖注入一直以来都是Spring面试中的核心...Bean延迟初始化(Lazy Initialization) 它的使用很简单,可以通过xml来配置和Java 注解@Lazy来为Bean的初始化进行配置。...那么问题来了,当某个Bean被定义为延迟初始化,那么当我们依赖注入拿到时,延迟和非延迟对象之间存在着什么差异呢?...Bean分了类,然后导致标识为正常初始化,非lazy-init的类或对象被定义成了剩余的单例。...总结 通过源码的深入,我们其实可以看出,延迟加载和非延迟加载在定义的时候,Bean注册的时候是没有区别的,在依赖查找和依赖注入的时候就明显不同了,非延迟是在上下文启动之前就初始化Bean了,而延迟是在Bean
这最后一步就是初始化,也就是 initializeBean(),所以这篇文章我们分析 doCreateBean() 中最后一步:初始化 bean。...applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; } 初始化...bean 的方法其实就是三个步骤的处理,而这三个步骤主要还是根据用户设定的来进行初始化,这三个过程为: 激活 Aware 方法 后置处理器的应用 激活自定义的 init 方法 激活 Aware 方法...BeanPostProcessor 的作用是:如果我们想要在 Spring 容器完成 Bean 的实例化,配置和其他的初始化后添加一些自己的逻辑处理,那么请使用该接口,这个接口给与了用户充足的权限去更改或者扩展...mbd.isExternallyManagedInitMethod(initMethodName)) { // 激活用户自定义的 初始化方法
spring 体系结构图 Bean初始化 个人认为,Spring最原始或者最基础的功能是“容器”,帮你管理着一堆bean的生命周期,任你取用,要想更好的使用Spring,还是得了解Bean的整个生命周期...,首先了解Bean的初始化过程。...本文采用XML配置文件的方式管理bean,分析XmlBeanFactory对于XML文件的解析过程。废话不多说,先上图: ?...getInputStream进行统一读取解析 Document:这个没啥好讲的,XML文档对象 EncodedResource:封装了Resource,指定Resource的编码 ReaderContext:Bean...定义的人,它做的可都是脏活累活,import/alias/bean等element以及element的子节点以及属性都是它解析并且填充到BeanDefinition中然后使用ReaderContext中的
在Bean对象的完整的生命周期前我们还需要给大家介绍下Bean对象自身初始化及销毁的相关方法。...Bean初始化及销毁方法 在Spring中给我们提供了两种操作的方法, 通过bean标签中的init-method和destroy-method属性来设置初始化及销毁对象时的回调方法 通过@PostConstruct...注解和@PreDestroy注解来标示初始化的方法及销毁回调的方法。...*/ public void start(){ System.out.println("--自定义的初始化的方法--"); } /** * 自定义的初始化的方法 */ @PostConstruct...Bean的完整生命周期
《深入理解Spring系列之四:BeanDefinition装载前奏曲》中提到,对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFactory)中完成...进行初始化,scope为其它值的bean会在使用到的时候进行初始化,如prototype。...在doGetBean中,首先会初始化其依赖的bean,然后进行自身的初始化,这个方法里关注如下的代码段。 // Create bean instance....= getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } 这段代码完成了单例bean的初始化,追踪代码进入doCreateBean...方法中,在这个方法中进行bean实例的创建、属性填充、将bean实例加入单例bean实例的缓存中。
本例主要介绍基于xml文件配置的4中初始化方法 1、使用property配置Bean 2、使用P标签简化配置Bean 3、使用构造函数初始化Bean 4、使用基础来初始化Bean applicationContext.xml...使用property初始化Bean属性 --> ...="audiCar" class="cn.com.infcn.bean.Car" p:brand="audi"> <bean id="bmwCar" class="cn.com.infcn.bean.Car.../ 3、使用使用构造初始化Bean printUser(ac, "user3"); // 4、使用基础来初始化Bean printUser(ac, "user4
概述 本章学习使用标签将某些Spring bean final静态常量字段注入另外bean。...Spring util:constant示例 从逻辑上讲,你将按照下面给出的方式执行bean。它有两个静态的final字段。MANAGER 和 DIRECTOR。...-- Use the static final bean constants here --> </bean
前言 在上一篇博文:【小家Spring】AbstractBeanFactory#getBean()、doGetBean完成Bean的初始化、实例化,以及BeanPostProcessor后置处理器源码级详细分析...源码分析的时候,留下两个重要的步骤还没有说,一个是属性赋值的populateBean()(依赖注入),还有一个就是赋值后对Bean的一些初始化操作:initializeBean() Spring源码基于的...进行Bean的初始化工作 上面步骤已经完成了Bean的属性的赋值工作,接下里就进行Bean的一些初始化工作,其中包括: 1:Bean后置处理器初始化 2:Bean的一些初始化方法的执行init-method...相当于当Servlet是以Bean的形式注入容器的时候,Bean初始化完成后,会自动调用它的init方法~~~~~~~~ //如果config为null,那么它传入可能为代理的DelegatingServletConfig...接口初始化 (如果配置了method-init,则调用其方法初始化 ) 调用applyBeanPostProcessorsAfterInitialization 初始化之后的处置操作 总结 populateBean
当前bean创建后,会初始化所依赖的bean,并注入。...初始化后,自定义初始化逻辑。...非显示依赖的bean,使用@DependsOn注解控制实例加载顺序 ---- 在spring容器加载类并实例化的过程中,除非指定显示依赖,则实例初始化的顺序是不可预知的,而且spring在以后的版本中,...注解@DependsOn,可以使隐式依赖的bean优先于当前bean初始化加载。 隐式依赖的情况比如DDD驱动模式中,spring可以使用事件监听模拟实现的业务场景中。...提前初始化加载; ----
领取专属 10元无门槛券
手把手带您无忧上云