Spring - 使用Autowire注入bean

时间:2015-01-30 16:34:39

标签: spring dependency-injection annotations javabeans

我正在尝试在一个简单的java项目中注入一个bean,但是我收到了ProductInformationServiceImpl的NullPointerException。

这些是我正在使用的课程:

AppConfig.java(Spring配置类)

package com.test.testing.config;

@Configuration
@ComponentScan(basePackages = "com.test")
public class AppConfig {
}

TestService.java接口:

package com.test.testing.service;

public interface TestService {
    String doIt();
}

TestService.java实现:

package com.test.testing.service;

@Service
public class TestServiceImpl implements TestService {
    public String doIt() {
        return "you did it!";
    }
}

主要课程:

package com.test.testing;

public class App {
    public static void main( String[] args ){
        Test w = new Test();
        System.out.println(w.getTestService().doIt());
    }
}

class Test {
    @Autowired
    private TestService testServiceImpl;

    public TestService getTestService() {
        return testServiceImpl;
    }

    public void setTestService(TestService testServiceImpl) {
        this.testServiceImpl = testServiceImpl;
    }
}

我做了一些使用以下方法检索bean的测试:

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
TestService app = (TestService)context.getBean("testServiceImpl");

但这是我想避免的事情。

1 个答案:

答案 0 :(得分:0)

我发现使用构造函数注入而不是字段注入的一般建议id,可以帮助你进行大量的可测试性。

@Component
@RequiredArgsConstructor(onConstructor=@__(@Autowired))
public class Animal {
    private final Sound sound;
    public String makeSound() {
        return sound.make();
    }
}

在测试中,您可以传递构造函数中的模拟或其他内容,而在运行应用程序时,构造函数注入将自动处理。 这是一个很小的test app,展示了构造函数的注入。