`
tmartin
  • 浏览: 104844 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

[转载]Spring中bean的实例化顺序

    博客分类:
  • J2EE
阅读更多

http://guoliangqi.iteye.com/blog/632697

http://blog.sina.com.cn/s/blog_525960510100ipwj.html

问题来源:

有一个bean为 A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。

如果只是在A里单纯的写着:

private B b;
private String name = b.funb();

会报错说nullpointException,因为这个时候b还没被set进来,所以为null。

解决办法为如下代码,同时学习下spring中 InitializingBean对象 构造方法init-method 的执行顺序。

public class A implements InitializingBean {

private B b;
private String name; // = b.funb();

public void setB(B b) {
System.out.println("A.setB initialed");
this.b = b;
}

public A() {
System.out.println("A initialed");
}

public void init() {
System.out.println("init");
this.name = b.funb();
}

@Override
public String toString() {
return super.toString() + this.name;
}

public void afterPropertiesSet() throws Exception {

//其实放在这里也可以

//this.name = b.funb();
System.out.println("afterPropertiesSet");

}

}

public class B {

public String funb() {
System.out.println("funb");
return "B.funb";
}

public B() {
System.out.println("B initialed");
}
}

spring配置文件

<beans default->
<bean id="a" class="testspring.A" init-method="init">
</bean>
<bean id="b" class="testspring.B">
</bean>
</beans>

 

测试代码:

public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext(
"src/testspring/bean.xml");
A a = (A) context.getBean("a");
System.out.println(a);

}

 

程序输出为:

A initialed
B initialed
A.setB initialed
afterPropertiesSet
init
funb
testspring.A@50d89cB.funb

从这里看到A的name属性在bean加载完成的时候也被成功设置为B的funB方法的返回值了,要点就是用init-method来实现。

加载顺序也可以看到为:

先构造函数——>然后是b的set方法注入—— >InitializingBean 的afterPropertiesSet方法——>init- method方法

 

总结为:

以下内容是从书中摘录 来的,但是我发现即使摘录一遍,对其内容的理解也会更加深入!
一、Spring装配Bean的过程
1. 实例化;
2. 设置属性值;
3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
6. 调用BeanPostProcessor的预先初始化方法;
7. 调用InitializingBean的afterPropertiesSet()方法;
8. 调用定制init-method方法;
9. 调用BeanPostProcessor的后初始化方法;


Spring容器关闭过程
1. 调用DisposableBean的destroy();
2. 调用定制的destroy-method方法;

转自:http://blog.sina.com.cn/s/blog_53dfe2580100vsdk.html

分享到:
评论

相关推荐

    Spring实例化Bean顺序

    在Spring框架中,Bean的实例化顺序是一个关键概念,它涉及到如何管理和协调多个Bean的创建与依赖关系。这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 ...

    Spring Bean 加载顺序 .

    Spring允许自定义BeanPostProcessor,它们在Bean实例化后执行特定的处理,比如AOP代理。这些后处理器将在Bean实例化后,初始化前介入。 7. **Bean初始化**: 实例化完成后,Spring会执行Bean的初始化方法,包括...

    spring的bean加载顺序样例项目

    - 如果Bean配置了AOP代理,如`@AspectJ`切面或基于接口的代理,那么在Bean实例化后,Spring会创建代理对象,代理对象负责拦截方法调用并执行相关的切面逻辑。 6. **Bean的销毁** - 对于单例Bean,Spring容器在...

    让spring解决控制springboot中bean的加载顺序的问题.docx

    @DependsOn注解可以直接声明一个Bean依赖于另一个Bean,确保依赖的Bean在被依赖的Bean实例化之前完成。例如: ```java @Configuration public class BeanOrderConfiguration { @Bean @DependsOn("beanB") public...

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    `@Bean`用在方法上,告诉Spring该方法将返回一个要管理的bean实例。这个bean将被添加到Spring的bean定义中,并且可以在其他bean中通过`@Autowired`进行注入。`@Bean`可以包含额外的配置,如`@Lazy`(表示延迟初始化...

    Spring bean 加载执行顺序实例解析

    今天,我们将通过一个实例来解析 Spring bean 加载执行顺序,了解 Spring 中 Bean 的生命周期。 首先,让我们来看一个简单的示例代码。我们有两个 Bean,A 和 B。A 有一个属性 name,需要在容器实例化的时候被赋值...

    spring加载顺序讨论

    1. **@PostConstruct注解**:在Bean实例化后,初始化之前,Spring会查找方法上标注了`@PostConstruct`的非静态方法,并在所有依赖注入完成后调用,用于执行初始化逻辑。这个注解可以确保在Bean完全准备就绪并可以...

    Spring Bean 生命周期之“我从哪里来?”.docx

    Spring会在Bean实例化后调用这个方法。 初始化顺序为:首先调用`@PostConstruct`注解的方法,然后是`InitializingBean`的`afterPropertiesSet()`方法,最后是XML配置的`init-method`。 此外,Spring还提供了`...

    Spring循环依赖正确性及Bean注入的顺序关系详解

    3. **Bean的实例化过程**:当尝试获取BeanA时,Spring会先检查`singletonObjects`。如果没有找到,但发现`singletonFactories`中有BeanA的信息,Spring会使用回调工厂来获取BeanA的实例,从而完成依赖注入。 4. **...

    day38 08-Spring的id、name和scope顺序

    4. `session`:在Web应用中,为每个HTTP session创建一个Bean实例。 5. `global-session`:在portlet环境中的全局session作用域。 理解`id`、`name`和`scope`的顺序是关键,因为在某些情况下,它们可能会相互影响。...

    Spring源码学习二:BeanDefinition解析1

    - `getBeanClassName()`:返回bean的类名,这是bean实例化的基础。 - `isSingleton()` 和 `isPrototype()`:检查bean是否为单例或多例。 - `getDependsOn()`:获取bean依赖的其他bean的名字列表,用于控制bean的初始...

    beandemo.rar

    6. **后初始化**:Bean实例化并注入属性后,Spring会执行`BeanPostProcessor`的`postProcessAfterInitialization`方法,允许开发者在Bean完全初始化后进行进一步的定制。 7. **Singleton Bean缓存**:对于单例Bean...

    spring入门学习-3、Bean装配(XML).pdf

    2. **初始化**:当Spring IoC容器加载时,会根据配置文件中的信息创建Bean实例,并执行任何指定的初始化方法。 3. **使用**:开发者可以通过Spring容器获取Bean的实例并进行使用。 4. **销毁**:在某些情况下,...

    Spring 内置 BeanPostProcessor类图.zip

    通过分析这个类图,我们可以看到Spring如何调用这些自定义处理器,并理解它们在bean实例化过程中的作用顺序。 `BeanPostProcessor.png`可能是这个类图的可视化表示,直观地展示了BeanPostProcessor在Spring容器中的...

    spring3.0mvc自学教程ppt+注解教程+注解实例+springmybatis教程+项目实例+中文api (老师的心血)从入门到项目实战

    3. **注解实例**:通过实例,你可以学习如何使用这些注解来简化代码,比如使用`@RequestMapping`处理不同的URL请求,`@Autowired`自动装配bean,以及`@Service`和`@Component`在组件扫描中的作用。 4. **Spring与...

    Spring多种加载Bean方式解析

    简单来说,通过一个BeanDefinition我们就可以完成一个Bean实例化。 BeanDefinition及其主要的子类有: 1. RootBeanDefinition和ChildBeanDefinition:这2个BeanDefinition是相对的关系,自Spring 2.5出来以后,...

    Spring+SpringMVC配置加载顺序1

    1. 应用启动,Servlet容器查找并实例化实现ServletContainerInitializer的类(SpringServletContainerInitializer)。 2. SSCI发现并使用实现WebApplicationInitializer的类(比如我们的AACDSI子类)。 3. ...

    如何正确控制springboot中bean的加载顺序小结篇

    - @DependsOn:使用@DependsOn注解可以明确指定当前Bean依赖于其他Bean,确保依赖的Bean在当前Bean实例化之前被创建。例如: ```java @Configuration public class BeanOrderConfiguration { @Bean @DependsOn...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. Class...

    Spring Annotaion Support详细介绍及简单实例

    如果你想实现一些自定义逻辑Spring容器实例化完成后,配置和初始化一个bean,您可以插入一个或多个BeanPostProcessor实现。  您可以配置多个BeanPostProcessor实例,您可以控制的顺序执行这些BeanPostProcessors通过

Global site tag (gtag.js) - Google Analytics