spring初始化bean的顺序

不是说单个bean的初始化顺序。这个顺序大体上是构造方法-set方法-init方法,详细的可以百度。

这里说的是在spring容器中互不相关的两个bean的初始化顺序。例如:

<bean id="a" class="A"/>

<bean id="b" class="B"/>

经过昨天遇到的问题,现在知道了这两个bean的顺序是以xml文件中的顺序为准的。例如a配置在b的前面,那么spring就先装配实例a,然后再装配实例b。

//题外,其实ibatis、mybatis里,sql和include等标签也是一样,sql必须定义在include的前面。

回过来说昨天遇到的问题。简单说是这样的:

class A{

private X x=B.service();

}

class  B{

private static C c;

public static X service(){

// TAG

c.yyyy();

}

public void setC(C c){

B.c=c;

}

}

<bean id="a" class="A"/>

<bean id="b" class="B">

<property name="c" ref="xxxxx"/>

</bean>

A通过B的静态方法service(),在构造方法中去初始化成员变量x;B的静态方法service()需要调用类变量c,而c是spring通过成员方法setC(C c)来注入的。

这种情况下,如果spring配置中,a在b的前面,则a在初始化的时候,会在TAG处抛出空指针异常。因为这个时候,srping还没有完成b的装配,因此B.c是null,调用c.yyyy()当然会抛异常。

时间: 2024-10-30 04:14:13

spring初始化bean的顺序的相关文章

Spring创建Bean的顺序

一直对Spring创建bean的顺序很好奇,现在总算有时间写个代码测试一下.不想看过程的小伙伴可以直接看结论 目录结构: 其中:bean4.bean5包下的class没有注解@Component,测试过程中,这两个包的class会直接通过<bean class="XXXXX"/>的方式创建.bean1.bean2.bean3包下的class注解了@Component,以便component-scan扫描.另外,bean创建之间没有依赖关系,例如bean1的创建不依赖于其他b

spring 初始化Bean

说起spring bean的初始化自然而然就离不开初始化阶段的循环引用:1 首先spring容器在启动后会创建一个beanFactory,new DefaultListableBeanFactory. 2 然后在spring容器启动过程中会调用核心的refresh方法,在这个方法中共调用了9个方法,即为spring容器的初始过程,所以说spring容器不单单是我们狭义概念中的map那么简单,在这个方法中包含两个最最主要的方法: 2.1 invokeBeanFactoryPostProcessor

spring 容器初始化 bean 和销毁前所做的操作

第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 [java] view plain copy import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class DataInitializer{ @PostConstruct public void initMethod() throws Exception { Sys

spring加载bean实例化顺序

转载:http://blog.sina.com.cn/s/blog_525960510100ipwj.html http://blog.sina.com.cn/s/blog_6940cab30102uwma.html 问题来源: 有一个bean为 A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b;private String name = b.funb(); 会报错说nullpointExce

Spring中Bean初始化及销毁方法(InitializingBean接口、DisposableBean接口、@PostConstruct注解、@PreDestroy注解、以及init-method方法和destroy-method方法)

一. 在Spring中Bean的初始化后以及销毁前的回调方式有: init-method:是指创建bean时调用的方法,注意,不是创建bean的方法. destroy-method:是指销毁bean时调用的方法,同样,不是销毁bean的方法. @PostConstruct注解:在bean实例化和注入后,进行初始化 @PreDestroy:在bean销毁前回调 InitializingBean接口: 查看InitializingBean接口的源码可以发现,只有一个方法,需要pojo继承Initia

Jboss AS 7 部署web应用程序时无法初始化spring的bean的解决办法

Jboss AS 7 在部署web应用程序的时候无法初始化spring的bean(在tomcat下边不会出现这个问题) 原因是web应用程序没有导入jboss对spring的支持的jar包 解决方法: 下载 snowdrop-vfs.jar(该文件在jboss-spring-subsystem-as7-nodeps-2.0.0.Final.zip包的module-deployer\org\jboss\snowdrop\main下,jboss-spring-subsystem-as7-nodeps

Spring中bean的作用域与bean的初始化与销毁

bean的作用域 通过在配置bean时,指定bean元素的scope来指定该bean的作用域 scope的默认值是singleton,即单例模式,在一个ApplicationContext中,每次调用getBean()方法,获取的都是同一个bean. 如果要使每次获取的bean 都不相同可以指定scope的值为prototype,那么每次调用getBean()都会获得一个新的bean Scope还可以去request指在一次Http请求中为单例 session在整个session范围中是单例的

一、 &nbsp; Spring启动时加载和初始化bean概述

Spring Context继承关系 ClassPathXmlApplicationContext->AbstractXmlApplicationContext->AbstractRefreshableConfigApplicationContext->AbstractRefreshableApplicationContext ->AbstractApplicationContext 而AbstractRefreshableApplicationContext 包含DefaultL

Spring给bean初始化属性值

可以在Spring容器初始化bean的时候给bean的属性赋初始值,直接在property标签里设置即可 1 2 3 4 5 6 <bean name="user**" class="com.fz.entity.User" >     <property name="id" value="1"></property>     <property name="username&