获取使用Java配置创建的自动连线bean的null

获取使用Java配置创建的自动连线bean的null,java,spring,spring-boot,spring-mvc,spring-restcontroller,Java,Spring,Spring Boot,Spring Mvc,Spring Restcontroller,我正在SpringBoot中创建一个REST服务。我在配置类中创建了一个bean,并试图通过自动连接在服务类中使用,但我总是得到null,我也尝试过构造函数注入,但没有工作。下面是代码 主应用程序 @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } } 休息控制器

我正在SpringBoot中创建一个REST服务。我在配置类中创建了一个bean,并试图通过自动连接在服务类中使用,但我总是得到null,我也尝试过构造函数注入,但没有工作。下面是代码

主应用程序

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}
休息控制器

@RestController
@RequestMapping("/v1")
public class RestController {

    @Autowired
    private Service service;
服务

@Service
public class ServiceImpl implements Service {
    //This is the bean
    @Autowired
    private Record record;
    
    public ServiceImpl() {   //-----------------> tried injecting in constructor as well
        System.out.println(record); //-------------------> null
    }
配置类

@Configuration
public class AppConfig {
    
    @Bean
    public Record record() {
        return new Record("test");
    }
}
我注意到每当我从config类中删除record()时,我都会得到下面的错误

required a bean of type 'com.ns.service.Record' that could not be found
添加方法后,不会报告错误,但返回null,这间接意味着record()被视为返回所需的bean。 我找不到我做错了什么,请告诉我

项目文件夹结构
我认为你在概念上做的一切都是对的

Spring首先创建一个对象,并且仅在该对象注入值之后创建(技术上在bean后处理器中完成):

所以试试这个:

@Service
public class ServiceImpl implements Service {
    //This is the bean
    @Autowired
    private Record record;
    
    public ServiceImpl() {   
        // here the record is null - not injected yet
        System.out.println(record); 
    }

    @PostConstruct
    public void checkThisOut() {
      // here print the record
    }
您说您也尝试过构造函数注入——它应该可以工作,因为spring必须向bean(ServiceImpl)的构造函数中注入一些东西,否则就会失败。请显示代码片段

这在某种程度上可能是错误的(尽管从您的描述中听起来不是这样的)您必须将所有
@配置
/
@服务
注释类放在包中,该包与使用
@springbootplication
注释创建主类的包相同或位于该包的下面。它指示SpringBoot在哪里查找bean


因此,请确保您的类遵守此规则……

您能提供您的项目结构吗?最好是通过扩展所有包来粘贴屏幕截图。当然,它在构造函数中是
null
。该字段只能在构造bean后进行自动连接。所以在构建对象之后,字段将被填充。@PostConstruct可以工作,甚至构造函数注入也可以工作,我可以再问一个问题吗,如果我想在构造函数中注入列表,它失败了,可能是什么问题是的,这就是我所怀疑的。向我展示你想在构造函数中注入列表的代码——考虑添加一个新问题并在这里张贴链接,这样我就可以跟踪它了。我会试着帮你…提出一个单独的问题