`
shaier
  • 浏览: 7921 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论

spring实例化Bean理解

阅读更多

spring加载bean实例化顺序

技术 2009-10-17 15:56:45 阅读127 评论0   字号: 订阅

问题来源:

有一个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-autowire="byName">
      <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方法;

分享到:
评论

相关推荐

    Spring实例化Bean顺序

    这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 首先,我们要知道Spring IoC容器是通过XML配置文件、注解或Java配置类来管理Bean的生命周期。Bean的...

    Spring 实例化Bean的三种方式

    ### Spring 实例化Bean的三种方式详解 在Java企业级应用开发中,Spring框架因其强大的功能和灵活性,成为了处理依赖注入、事务管理等任务的首选工具。其中,Bean的实例化是Spring框架的核心功能之一,它支持多种...

    Spring的三种实例化Bean的方式

    在Spring框架中,实例化Bean是管理对象生命周期的关键部分。Spring提供了多种方式来创建和管理Bean,这使得我们可以根据项目需求灵活选择最佳实践。本文将详细介绍Spring中的三种主要的Bean实例化方式:XML配置、...

    Spring实例化bean过程解析及完整代码示例

    今天我们将详细介绍Spring实例化bean的过程,并提供一个完整的代码示例,以便更好地理解这个过程。 第一步:调用Bean的默认构造方法 在实例化bean时,Spring首先会调用Bean的默认构造方法(当然也可以是指定的其它...

    Spring Bean创建初始化流程.docx

    在预实例化过程中,`getBean(beanName)`被调用,这是`AbstractBeanFactory`类中的一个方法,用于从Bean工厂中获取指定名称的Bean实例。 6. **实际获取Bean**: 进入`doGetBean()`方法,这是Bean实例化的关键步骤...

    Spring Bean实例化实现过程解析

    Spring Bean 实例化实现过程解析 Spring Bean 实例化是 Spring 框架中一个非常重要的概念,它直接关系到 Bean 的生命周期和管理。在 Spring 框架中,Bean 的实例化是通过容器来管理的,容器会根据配置文件中的信息...

    Sping学习笔记(2)----实例化Bean的三种方式

    在Spring框架中,实例化Bean是其核心功能之一,它为开发者提供了多种方式来创建和管理对象。这篇“Spring学习笔记(2)---...理解并熟练掌握这些实例化Bean的方法,对于深入理解Spring框架以及构建高效的应用至关重要。

    浅谈springioc实例化bean的三个方法

    浅谈Spring IOC实例化Bean的三个方法 Spring IOC(Inversion of Control,控制反转)是Spring Framework中的一种核心机制,用于管理Bean的生命周期。实例化Bean是IOC的核心步骤之一,本文将详细讲解Spring IOC实例...

    SpingIOC注入实例化bean

    - **工厂方法**:可以定义一个静态或非静态工厂方法,Spring调用这个方法来实例化bean。 3. **依赖注入(DI)** Spring的依赖注入允许bean之间通过接口而非具体实现进行耦合,提高了代码的可测试性和可维护性。...

    Spring项目bean实例化代码

    在Spring框架中,Bean的实例化是核心概念之一,它涉及到如何管理和控制应用程序中的对象生命周期。本篇文章将深入探讨Spring项目中Bean的实例化...理解并掌握这些实例化方法对于开发高效且可维护的Spring应用至关重要。

    实例化Spring bean的两种工厂方法

    在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态工厂方法,用于创建Spring Bean。 首先,我们要理解Spring Bean的概念...

    Spring实例化bean的方式代码详解

    在Spring框架中,实例化bean是核心功能之一,它涉及到对象的创建、初始化和管理。本篇文章将详细探讨Spring实例化bean的三...希望本文内容对理解和使用Spring实例化bean有所帮助,如果有任何疑问或建议,欢迎交流讨论。

    Spring Bean重复执行两次(实例被构造两次)问题分析

    如果一个BeanA依赖于另一个BeanB,同时BeanB也依赖于BeanA,那么Spring在处理依赖关系时可能会陷入循环引用,导致两个Bean都实例化两次。 3. **@PostConstruct与初始化回调**:Spring允许我们在Bean初始化后执行...

    详解Spring中bean实例化的三种方式

    在Spring框架中,Bean的实例化是其核心功能之一,用于管理...理解并掌握这些实例化方式有助于更好地利用Spring框架管理应用程序的组件。在实际项目中,根据具体情况选择合适的方法,以实现最佳的可维护性和可扩展性。

    spring中的bean

    在Spring中,Bean通常代表应用程序中的一个对象,这些对象由Spring容器(ApplicationContext)管理,包括创建、初始化、装配和销毁。Bean可以通过XML配置文件、注解或者Java配置类进行定义。 1. **Bean的定义**:在...

    Spring Boot: Bean definition overriding

    因此,我们有2种配置,它们使用名称beanName实例化bean,在主应用程序中,我们仅打印该bean的值(非常重要的是,它们都具有相同的名称)。 那么您认为将要打印什么? 示例1 @SpringBootApplication public class ...

    Spring 延迟实例化

    ### Spring 延迟实例化的理解与应用 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,它提供了一种全面的方式来构建应用程序。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程...

    spring bean的生命周期

    - **实例化**:Spring通过`Class.forName()`或`new`关键字实例化Bean。如果在XML配置中指定了`class`属性,Spring将根据该属性创建Bean。 - **属性注入**:Spring会将依赖注入到Bean中,包括值注入(value,ref)...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    Spring 框架系列(8)- Spring IOC 实现原理详解之 Bean 实例化(生命周期、循环依赖等) ...通过了解 Spring 框架中 IoC 的设计要点和设计结构,我们可以更好地理解 Bean 的实例化过程和生命周期。

    spring IOC反射装载bean

    接下来,Spring使用Java的反射机制来实例化Bean。反射允许程序在运行时动态地获取类的信息(如类名、方法名等)并调用它们。在上述例子中,Spring会创建一个`MyClass`的实例,并根据`property`标签设置相应的属性值...

Global site tag (gtag.js) - Google Analytics