为什么我的@Autowired为null

时间:2018-01-20 07:46:00

标签: spring spring-boot

我有一个springboot应用程序(我很陌生)

这是我的配置类:

@SpringBootApplication
@EnableScheduling
@Configuration
@ComponentScan(basePackages="com.blah")
public class Application extends SpringBootServletInitializer {

    private static final Logger log = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

我的所有课程都在com.blah.xxx包中。 我在同一个包中有另一个类,我可以通过使用上下文来使用该服务,而不是@Autowired:

@Component
public class MainClass implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        main(args);
    }

    public static void main(String[] args) {
        AbstractApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
        ValueService service = (ValueService) context.getBean("valueService");
        System.out.println("blabla" + service.getValues().toString());
        context.close();
    }
}

我得到了第三个类,仍然在相同的包和相同的模块中,我想使用@Autowired但它是null:

@Component
public class ThirdClass{

@Autowired
private ValueService valueservice;

public ThirdClass() {

    valueservice.getValues(); // <-- Here valueservice is null

}

@Scheduled(cron = "0 0/1 * * * ?")
    public void check() {
        System.out.println("check");
    }

我知道@ComponentScan在我的ValueService中运行良好(在另一个模块中,但仍然包com.blah),我有一个@Autowired的ValueDao,这是有效的:

@Service("valueService")
public class ValueService {

    @Autowired
    ValueDao valueDao;

这里有什么问题,如何在我的ThirdClass中使用@Autowired? THX!

1 个答案:

答案 0 :(得分:1)

您尝试从对象的构造函数内部访问Autowired字段。那可能无法奏效。如果对象尚未拥有该对象,则Spring无法设置对象字段的值。要拥有该对象,必须首先调用其构造函数。因此,在调用构造函数时,该字段仍为空。

如果要在构造bean之后使用依赖项,请使用带有@PostConstruct注释的void方法。

或者做推荐的事情:使用构造函数注入而不是字段注入。