为使用 Java 配置创建的自动装配 bean 获取空值

Getting null for Autowired bean created using Java config

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

主应用程序

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

REST 控制器

@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
    }

配置class

@Configuration
public class AppConfig {
    
    @Bean
    public Record record() {
        return new Record("test");
    }
}

我注意到每当我从配置中删除 record() 时 class 我得到以下错误

required a bean of type 'com.ns.service.Record' that could not be found

并且添加方法后不报错,返回null,间接表示record()被认为是返回了需要的bean。 我找不到我做错了什么,请指教。

项目文件夹结构

我认为你在概念上做的一切都是正确的

Spring 首先创建一个对象,然后才注入值(技术上在 bean post 处理器中完成):

所以试试这个:

@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) 的构造函数中,否则就会失败。请显示代码片段

其中一个在某种程度上可能是错误的(尽管从您的描述中听起来不像这样)是您必须将所有 @Configuration/@Service 注释为 classes 在相同的包中或在您创建主 class 并使用 @SpringBootApplication 注释的包下方。它指示 spring 启动到哪里寻找 bean。

因此请确保您的 class 遵守此规则...