在具有非默认构造函数的类中,如何初始化@Autowired对象?

时间:2019-06-18 21:31:11

标签: java spring javabeans openjpa

语言/框架:Java8 /春季4.3.9 / openjpa 2.4.3

作为Spring的新手,我怀疑我在这里没有应用适当的模式。

这种情况类似于下面所示。但是,我无法使objectB初始化并且抛出 Null Pointer异常。我怀疑问题在于Spring无法初始化类A,但是我无法将“ @Component”注释设置为类A,因为它没有默认的构造函数。有这种情况的解决方法吗?应该遵循的模式?这是Spring改进的遗留代码。

@ContextConfiguration(locations = { "classpath:/context.xml" })
ClassTestA{

    @Test
    public void TestA(){

        :
        :
        A a = new A ("A", "B", "C", "D");
        :
        :
     // Following line, Throws a null pointer exception in the doSomething() method.
        someobject.someMethod(a.doSomething());         

    }

}

class A {

    @Autowired  
    private B objectB;


    public A (string t, string m, string x, string y)
    {
        // variable inits

    }

    // C class represents a database table Entity 
    public C doSomething()
    {
        C c = new C();

        c.someWork(objectB.method()); // throws a null pointer exception because obJectB is null !

    }       

}

@Component
public class B
{
      // No constructor



}

1 个答案:

答案 0 :(得分:0)

在测试中,您已经使用new关键字创建了A类对象。一旦完成,spring将不会处理A类中的依赖项,因此不会自动装配B类对象。为了使spring自动装配类的依赖关系,应该通过spring来管理类本身。另一种解决方法是编写一个用@Bean注释的方法,在该方法内,您可以使用您选择的带有默认值的任何构造函数来创建类A的对象,这样您就可以在测试中自动连接类A,而无需使用new关键词。然后,您不必使用@Component注释A类。

@Bean
public A getA() {
   return new A(null,null,null,null);
}

您可以在带有@Configuration注释的类中编写以上代码,以便spring读取并创建A对象并将其放入容器中。

您可以同时使用基于XML和注释的配置。只需在sprint.xml中添加标签(请在Google上搜索标签)

在测验中你可以说

@Autowired
private A aObject