来源与默认注入办法
public class MyService { private MyRepository repository; @Autowired public MyService(MyRepository repository) { this.repository = repository; } @Autowired public void setAnotherDependency(AnotherDependency dependency) { //... } }
@Resource紧张用于成员变量和 setter 方法上进行依赖注入。示例:
public class MyService { @Resource private MyRepository repository; @Resource public void setAnotherDependency(AnotherDependency dependency) { //... } }
@Inject可用于布局函数、方法参数以及成员变量上进行依赖注入,用法与@Autowired较为相似。示例:
public class MyService { private MyRepository repository; @Inject public MyService(MyRepository repository) { this.repository = repository; } }
对 null 值的处理差异

public class MyService { private MyRepository repository; @Autowired @Qualifier("mySpecificRepository") public MyService(MyRepository repository) { this.repository = repository; } }
@Resource:可通过指定name属性明确要注入的 bean 名称。示例:
public class MyService { @Resource(name = "mySpecificRepository") private MyRepository repository; }
@Inject:紧张依赖类型进行自动装置,没有像@Autowired和@Resource那样方便指定 bean 名称的办法。支持参数的不同
public class MyService { private MyRepository repository; private int someValue; @Autowired public MyService(MyRepository repository) { this.repository = repository; } @Value("${some.property}") public void setSomeValue(int someValue) { this.someValue = someValue; } }
@Resource:支持通过指定name属性来明确要注入的 bean 的名称,但相对来说配置选项较为有限。@Inject:紧张依赖类型进行自动装置,没有像@Autowired那样丰富的结合其他表明进行配置的办法。依赖查找顺序有别@Autowired:Spring 处理@Autowired表明时,先根据类型查找。若有多个相同类型的 bean,结合@Qualifier表明或 bean 的名称确定详细要注入的 bean。若未指定@Qualifier且有多个相同类型的 bean,会抛出非常。例如:有两个实现同一接口的 bean,未利用@Qualifier指定详细 bean,注入时会涌现NoUniqueBeanDefinitionException。@Resource:先按名称查找,若未指定名称则按类型查找。这种办法更加灵巧,可根据情形选择通过名称或类型进行依赖查找。例如:利用@Resource时指定 bean 名称,Spring 会直接根据名称查找对应的 bean;若未指定名称,会根据类型查找。@Inject:紧张按照类型查找,与@Autowired类似,但没有@Autowired通过@Qualifier指定名称的便捷办法。若有多个相同类型的 bean,也可能涌现类似非常情形。
在 Spring 开拓中,理解@Autowired、@Resource和@Inject这三个表明的差异,能帮助我们更好地进行依赖注入,选择最适宜项目需求和开拓风格的表明,提升开拓效率和代码质量。