Spring实例化bean顺序问题,导致注入失败

我们可以通过Spring进行非常方便的管理bean,只需要在类上面加一个注解就可以进行bean的注入,也就是所谓的DI。今天碰到了个小问题,来总结一下。

问题如下:

public abstract class TestBean {
    public String str;

    public TestBean(){
        this.str = initStr();
    }

    protected abstract String initStr();
}

public class TestSon extends TestBean {

    @Resource
    public String str;

    @Override
    protected String initStr() {
        return this.str;
    }
}

但是发现这个str始终是null。

原因:在实例化TestBean的时候不能确认str已经实例化,所以是先建立对象,再进行注入str的值。那么创建对象的时候,根据构造方法创建的对象中,还没有注入str的值,所以只能为null。

解决:我们需要确认在str已经注入进来的情况下再对父类中的str赋值,那么这个时候需要子类实现 InitializingBean 这个接口,实现其中的afterPropertiesSet()

public class TestSon extends TestBean implements InitializingBean
{

    @Resource
    public String str;

    @Override
    protected String initStr() {
        return this.str;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        super.str = this.str;
    }
}

问题成功解决。注入成功

时间: 2024-11-16 09:09:59

Spring实例化bean顺序问题,导致注入失败的相关文章

Spring 实例化Bean的两种方式

使用Spring管理Bean也称依赖注入( Dependency Injection, DI ),通过这种方式将Bean的控制权交给Spring 在使用Spring实例化一个对象时,无论类是否有参数都会默认调用对象类的无参构造,对于有参数的情况,Spring有两种方式可以带参实例化 示例类 Shape public class Shape { private Integer width; private Integer height; public Shape() { System.out.pr

学习使用Spring实例化Bean

学习使用Spring实例化Bean 1.通过默认构造方法实例化Bean 创建代码 package com.imooc.spring.ioc.class05; public class Bean1 { public Bean1() { System.out.println("Bean1.Bean1"); } } <bean class="com.imooc.spring.ioc.class05.Bean1" name="bean1_1,bean1_2&

Spring实例化bean的三种方法

1.用构造器来实例化 [html] view plain copy print? <bean id="hello2" class="com.hsit.hello.impl.ENhello" /> 2.使用静态工厂方法实例化 要写一个bean,bean中定义一个静态方法,生成bean,配置factory-method指定静态方法,运行时容器就会自动调用静态方法生成实例 bean [java] view plain copy print? package c

Spring 实例化bean的方式

实例化bean的方式有三种: 1.用构造器来实例化 2.使用静态工厂方法实例化 3.使用实例工厂方法实例化 当采用构造器来创建bean实例时,Spring对class并没有特殊的要求, 我们通常使用的class都适用 基于XML的元数据配置文件,可以这样来指定bean类: 当采用静态工厂方法创建bean时,除了需要指定class 属性外,还需要通过factory-method属性来指定创建bean实例 的工厂方法.Spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言, 跟通过普

Spring实例化bean的三种方式

在面向对象编程的过程中,要想调用某个类的成员方法,首先要实例化该类的成员变量. 在Spring 中,实例化Bean有三种方式: 1.构造器实例化:2.静态工厂方式实例化:3.实例化工厂方式实例化 构造器实例化:Spring容器通过Bean对应的类中默认的构造器函数实例化Bean. 1-1.创建一个实体类 Person1 package com.mengma.instance.constructor; public class Person1 { } 1-2.创建Spring配置文件,在 com.

Spring 实例化bean的三种方式

第一种方法:直接配置Bean Xml代码   <bena id="所需要实例化的一个实例名称" class="包名.类名"/> 例如: 配置文件中的bean.XML代码: Xml代码   <bean id="userA" class="com.test.User"/> Java代码   package com.test public class User{ public void test(){ Sys

Spring实例化bean

package com.itany.test; import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; 编写配置文件beans.xml <?xml version="1.0" encoding="UTF-8"?>

activiti中实现TaskListener注入Spring的bean

一开始我写的bpmn中 然后在我的监听器中注入的Spring的bean为空,注入不进来. 像这样,tenderService为null 注入不了. 此时需要把bpmn中这样设置,sendDocumentStartListener是监听器的类名(在这里首字母要小写) 监听器里要这么写(注意要加上@Component注解) 此时就可以注入Spring的bean了 原文地址:https://www.cnblogs.com/lqtbk/p/11018475.html

Spring AOP操作action时无法注入,报NullPointer异常

Spring AOP操作action时无法注入,报NullPointer异常当使用Spring AOP对action层进行操作时,会出现注入失败的问题,出现空指针异常.原因是一般struts2+spring应用中,spring的插件只负责为action的ioc部分,但并没有进行功能加强,即采用代理的机制,所有的action还是使用struts2进行管理,在使用AOP后,这些action需要由spring进行管理,如果没有由spring进行代理,将出现注入失败.解决办法:Struts2的一个特殊的