首页 > 解决方案 > 如何在构造函数中使用@Autowired 对象?

问题描述

Autowired 类在构造函数中为空

我有以下代码结构,其中 Bar 类中的 Autowired Foo 类为空。尝试在 Bar 中创建 Foo 的对象,但随后 @Autowired Doo 变为空。

@Service
public class Doo{

    public String getString(){
       return "String";
    }
}

@RestController
@Component
@RequestMapping(value = "/do/something", method = RequestMethod.GET)
public class Foo {
    @Autowired 
    private Doo doo;
    // method
    public String getString(){
         return doo.getString();
    }
}

@Component
public final class Bar {
    @Autowired
    Foo foo;

    private static final Bar bar = new Bar();

    private Bar (){
        foo.getString();
    }

    public static Bar getInstance(){
         return bar;
    }
}

标签: javaspringspring-boot

解决方案


您的代码有点混乱,因为Bar没有做任何事情。

我测试了以下代码并且它正在工作:

Foo.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Component
public class Foo {
    @Autowired
    private Doo doo;

    @RequestMapping(value = "/do/something", method = RequestMethod.GET)
    public String getString() {
        return doo.getString();
    }
}

斗.java

import org.springframework.stereotype.Service;

@Service
public class Doo {

    public String getString() {
        return "String";
    }
}

实例化控制器不是最佳实践,因为业务逻辑应该在服务类上进行。

正如@benji2505 指出的那样,您的问题也有一些错别字。

我将 RequestMapping 注释更改为方法级别,您可以保持原样,但您还需要按照以下方式向方法添加 RequestMapping: 有人可以解释一下类级别控制器和方法级别控制器之间的区别吗?


推荐阅读