一、基于构造器的依赖注入

private final InventoryMapper inventoryMapper;

public InventoryController(InventoryMapper inventoryMapper) {
    this.inventoryMapper = inventoryMapper;
}

二、基于Setter的依赖注入

private InventoryMapper inventoryMapper;

public void setInventoryMapper(InventoryMapper inventoryMapper) {
    this.inventoryMapper = inventoryMapper;
}

三、基于字段变量field的依赖注入

@Autowired
private InventoryMapper inventoryMapper;
  1. 基于字段变量field的依赖注入
    优点:基于字段变量的依赖注入方式非常简洁,没有任何多余代码,有效的提高了Java的简洁性。
    缺点:不能指明具体的依赖。可能会遇见依赖注入的对象为null,所以这种方式过于依赖注入容器,当没有启动整个依赖容器时,这个类就不能运转,在反射时无法提供这个类需要的依赖。
  2. 如果使用基于Setter的依赖注入方式,它是一种选择性注入,可有可无的,即使没有注入这个依赖,也不会影响整个项目的运行。
  3. 如果基于构造器的依赖注入方式,它是一种强制性的,显示的注入。固定依赖注入的顺序,能解决循环依赖的问题。

对依赖注入的理解:

首先了解关于注入的两个概念IOC(控制反转)和DI(依赖注入),简单的说,IoC是一种思想,而DI则是一种行为。也可以说IoC是目的,DI是手段。IoC是指让生成类的方式由传统方式(new)反过来,开发程序时不需要调用new,当需要使用某个类的时候由框架来注入(DI)即可。

注解的区别

@Autowired:表示自动注入,自动从spring的上下文找到合适的bean来注入
@Resource:表示按指定名称注入,@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。 当然,还可以为 @Service和@Resource 添加 name 这个属性来区分不同的实现。
@Component:表示一种泛指,被标记类即组件,Spring扫描注解配置时,会标记这些类要生成对应的bean。
@Qualifier和@Autowired配合使用,当一个接口有多个实现的时候,@Qualifier的value定了具体调用哪个类的实现(需要在实现类中通过@Service来表示每个不同的bean),也就是说指定了注入bean的名称。
Controller、Service、、Repository分别作用类是控制层类、业务层类、数据访问层类,Spring扫描注解配置时,会标记这些类要生成对应的bean。
@Autowired和@Resource是用来修饰字段,构造函数,或者方法,其作用是注入bean。而@Service,@Controller,@Repository,@Component则是用来修饰类,标记这些类要生成bean。