为什么我可以不使用@autowired

时间:2019-11-07 03:19:59

标签: spring spring-boot

这是第5页上的示例中的动态

OrderController.java

@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
public class OrderController {

    private OrderRepository orderRepo;

    public OrderController(OrderRepository orderRepo) {
        this.orderRepo = orderRepo;
    }

    @GetMapping("/current")
    public String orderForm() {
        return "orderForm";
    }

    @PostMapping
    public String processOrder(@Valid Order order, Errors errors, SessionStatus sessionStatus) {
        if (errors.hasErrors()) {
            return "orderForm";
        }

        orderRepo.save(order);
        sessionStatus.setComplete();

        return "redirect:/";
    }

}

OrderRepository.java

public interface OrderRepository {

  Order save(Order order);

}

为什么我可以使用此代码而不添加@Autowired 感谢您的帮助。

public OrderController(OrderRepository orderRepo) {
        this.orderRepo = orderRepo;
    }

2 个答案:

答案 0 :(得分:3)

它的春天特色。

为此打开了一个已解决的issue

长话短说:

如果该类只有一个构造函数(并且在Java中,一旦创建了构造函数,则默认的no-arg构造函数将不复存在)并被注释为@Component,那么spring可以“理解”该构造函数调用此构造函数是实例化bean的唯一方法。因此,它会自检其参数并注入所需的内容。 所有这些操作都没有真正指定@Autowired

从Spring 4.3 RC1开始有效:请参见Release notes

答案 1 :(得分:0)

我认为应该在传递给OrderController构造函数之前(通过@Configuration或XML)创建OrderRepository实例。在这种情况下,不需要@Autowired注释。