首先,我了解Difference between initializing a class and instantiating an object?
单词bean初始化和实例化是否可以互换,或者bean实例化后是否发生bean初始化?
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"com/springinaction/springidol/spring-idol.xml");
Performer performer = (Performer) ctx.getBean("duke");
performer.perform();
当bean初始化并实例化时,也可以使用上面的例子。
答案 0 :(得分:2)
bean被Spring容器实例化并初始化,这就是依赖注入(DI)的工作原理。 你在代码中做了什么,你声明你想要在你定义的这个执行者变量中注入一个Performer实例。您的DI上下文将注意传递您在上下文中实际可用的此实例。你可以期待像这样的行为
修改强>
如果要影响bean的初始化,可以定义初始化回调,有关该主题的更多信息,请参阅here。
编辑2
Spring Bean Lifecycle Tutorial还为您提供了一个很好的流程图,表明您的容器中发生了什么。如果您查看那里的图表,在“bean可以使用”语句之后,它将被注入到您声明了预期用途的代码段中。
答案 1 :(得分:0)
这可能会迟到但是
我将首先提到加载 bean 定义后有关 spring bean 生命周期的三个事实。
Bean 被实例化 :这基本上意味着 bean 工厂正在调用每个 bean 的构造函数。
依赖项被注入:只有在 setter 或字段上完成自动装配时才会发生这种情况,我们注入依赖项。
Initialization : 这个是比较模糊的地方,简单来说@PostConstruct 就是初始化阶段,这个会调用注解的方法来初始化bean的状态。深入:
<块引用>@PostConstruct 通过启用组件扫描被拾取,并由一个名为 internalCommonAnnotationProcessor 的预初始化 bean 调用,该 bean 的类型实现了 BeanPostProcessor名为 CommonAnnotationBeanPostProcessor 的接口。实现这个接口的类是允许修改 bean 实例的工厂钩子。应用程序上下文会自动检测这些类型的 bean 并在容器中的任何其他 bean 之前实例化它们,因为在它们实例化之后,它们被用来操作由 IoC 容器管理的其他 bean。
<块引用>BeanPostProcessor接口声明了两个方法要实现,已经声明为默认接口方法,以便开发者可以自由地 >只实施那些表现出兴趣的。这些方法名为 postProcessBeforeInitialization 和 postProcessAfterInitialization。
<块引用>通常,填充 bean 属性的后处理器会选择 @PostConstruct 注释的 方法 实现 postProcessBeforeInitialization,而包装的后处理器带有代理的 bean 通常会实现 postProcessAfterInitialization。
知识来源:关于 oreilly 的关键认证专业 spring-5 书。
所以我个人的回答是
<块引用>构造函数是关于实例化的,
<块引用>初始化总是在 DI 完成(构造函数、setter 或字段)之后进行。