我有一个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!
答案 0 :(得分:1)
您尝试从对象的构造函数内部访问Autowired字段。那可能无法奏效。如果对象尚未拥有该对象,则Spring无法设置对象字段的值。要拥有该对象,必须首先调用其构造函数。因此,在调用构造函数时,该字段仍为空。
如果要在构造bean之后使用依赖项,请使用带有@PostConstruct
注释的void方法。
或者做推荐的事情:使用构造函数注入而不是字段注入。