`
yznxing
  • 浏览: 370090 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring加载bean实例化顺序

    博客分类:
  • java
阅读更多

问题来源:

有一个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方法;

 

 

2
0
分享到:
评论
3 楼 yznxing 2010-09-13  
jyslb 写道
spring能保证manager和accountDao在beanOne被加载之前被加载。



恩恩,不错,之前没注意这个,谢谢提醒哇,学习了。


ps:
我记得我最近也遇到类似的,使用 @PostConstruct 注解,也能达到类似的效果。
2 楼 jyslb 2010-09-13  
spring能保证manager和accountDao在beanOne被加载之前被加载。
1 楼 jyslb 2010-09-13  
使用depends-on不就可以了么?

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

相关推荐

    spring的bean加载顺序样例项目

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

    Spring Bean 加载顺序 .

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

    spring加载顺序讨论

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

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

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

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

    Spring bean 加载执行顺序实例解析 在 Spring 框架中,Bean 的加载和执行顺序是一个非常重要的概念。今天,我们将通过一个实例来解析 Spring bean 加载执行顺序,了解 Spring 中 Bean 的生命周期。 首先,让我们来...

    Spring多种加载Bean方式解析

    Spring多种加载Bean方式解析 本篇文章主要介绍了Spring多种加载Bean方式解析,通过对Bean加载方式...通过对Spring加载Bean方式的了解,我们可以更好地理解Spring中的Bean加载机制,从而更好地使用Spring框架进行开发。

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

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

    Spring+SpringMVC配置加载顺序1

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

    beandemo.rar

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

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

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

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

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

    2023最新Spring全家桶面试题-图灵徐庶

    10. IOC容器的加载过程:通过读取配置文件和注解来加载BeanDefinition,然后实例化Bean并建立依赖关系。 11. Spring的扩展点:包括BeanFactoryPostProcessor、BeanPostProcessor、...

    浅谈BeanPostProcessor加载次序及其对Bean造成的影响分析

    然而,BPPs的实例化顺序可能会比普通Bean更早,因为Spring需要它们尽早准备好处理后续创建的Bean。但是,如果BPP依赖于其他Bean,那些被依赖的Bean可能在BPP实例化之前就已经被创建,这就可能导致一些问题,比如某些...

    Spring源码学习三:BeanFactory解析1

    2. **Bean实例化**: 当调用`getBean`方法时,根据BeanDefinition创建Bean实例,可能是单例或多例。 3. **依赖注入**: 解析Bean的依赖关系,使用`DependencyDescriptor`查找依赖的Bean,并通过反射设置属性或调用...

    spring源码合集spring源码合集

    6. **推断构造方法源码解析**:"09-Spring之推断构造方法源码解析-周瑜"讨论了Spring如何选择合适的构造函数来实例化Bean,这对于实现无参和有参构造函数的自动匹配至关重要。 7. **Bean生命周期源码解析**:"05-...

    spring-reference.pdf

    - **Lazily-instantiated beans**: 延迟加载Bean,直到第一次请求时才初始化。 - **Autowiring collaborators**: 自动装配协作对象,简化了配置。 - **Checking for dependencies**: 检查Bean是否存在未满足的依赖。...

    spring boot javafx 集成 实例Demo 源码

    Spring Boot和JavaFX的集成是将现代化的Spring框架与Java桌面应用开发的强大工具结合在一起,为开发者提供了一种创建桌面应用程序的新方式。本实例Demo展示了如何利用Spring Boot和JavaFX来构建一个完整的桌面应用...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    - 在调用 `BeanFactoryPostProcessor` 方法时,此时bean还未实例化,只是刚刚被解析成了`BeanDefinition`对象。 3. **Bean的生命周期** - Spring IoC容器负责管理Bean的生命周期,包括bean的创建、属性赋值、初始...

    testNG集成spring

    在集成Spring和TestNG的过程中,只需让测试类继承`AbstractTestNGSpringContextTests`或`AbstractTransactionalTestNGSpringContextTests`等...加载Spring的`ApplicationContext`或使用`BeanFactory`来获取Bean实例...

    Spring配置使用之Bean生命周期详解

    当启用了 lazy-init 属性时,Spring IoC 容器不会在初始化时实例化 Bean,而是等到调用 Bean 时才会去创建 Bean。这可以减少系统的资源占用和提高系统的性能。 定义 Bean public class Animals { public Animals...

Global site tag (gtag.js) - Google Analytics