自动连线会引发空指针

时间:2019-10-09 20:55:21

标签: java spring

自动连接我的一个类时,出现空指针异常。

我尝试使用不同的注释,例如@Component@ComponentScan

public class ClassA {
    public final String str = "String";

    public ClassA(){
        System.out.println("Class A initiated");
    }
}


public class ClassB {

    @Autowired
    public ClassA classA;

    public ClassB(){
     System.out.println(classA.str);
    }


}

@Configuration
public class Config {

    @Bean
    public ClassA classA(){
        return new ClassA();
    }

    @Bean
    public ClassB classB(){
        return new ClassB();
    }
}

Stacktrace:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'classB' defined in class path resource [com/test/demo/Config.class]: Bean instantiation via factory method failed;
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.test.demo.ClassB]: Factory method 'classB' threw exception; nested exception is java.lang.NullPointerException

4 个答案:

答案 0 :(得分:2)

构造函数在之前运行。Spring会插入自动连接的字段,因此classA字段仍为null。

将代码移到构造函数(和字段初始值设定项)之外,您应该看到正确的值。

答案 1 :(得分:2)

而不是使用@Autowired。通过ClassB的构造函数注入ClassA。

public class ClassB {
private final ClassA classA;

public ClassB(ClassA classA){
     this.classA = classA;
     System.out.println(classA.str);
}

然后将ClassB的Bean配置更改为ClassA。

答案 2 :(得分:1)

如果您希望像这样在构造函数中提取值,则可以使用构造函数注入而不是字段注入:

public class ClassB {
    public ClassA classA;

    @Autowired
    public ClassB(ClassA classA){
     this.classA = classA;
     System.out.println(classA.str);
    }
}

从Spring 4.3开始,具有单个构造函数的类可以省略@Autowired注释。Spring在进行包扫描时会遇到我们的'ClassB'类,并通过调用带注释的@Autowired来初始化其实例构造函数。

在代码中,自动装配是在调用no args构造函数之后发生的。因此,当您尝试使用classA对象访问'str'时,由于classA尚未自动装配,因此会导致空指针异常。

答案 3 :(得分:-1)

尝试将@Component@Service放在ClassA

@Component
public class ClassA {
    public final String str = "String";

    public ClassA(){
        System.out.println("Class A initiated");
    }
}

发生这种情况是因为类ClassA不是Spring Bean。