来源与默认注入办法

@Autowired:Spring 框架特有的表明,默认按照类型进行自动装置。
这意味着 Spring 会在容器中搜索与被注入工具类型匹配的 bean,若有多个相同类型的 bean,可结合@Qualifier表明指定详细要注入的 bean 名称。
@Resource:Java EE 规范中的表明,后被 Spring 支持。
先按照名称进行自动装置,若未指定名称,则按照类型装置。
@Inject:Java 依赖注入规范(JSR-330)中的表明,默认按照类型自动装置,类似@Autowired但无法像@Autowired那样结合@Qualifier指定名称。
用法灵巧性

@Autowired相对更灵巧,可用于布局函数、方法参数以及成员变量上进行依赖注入。
示例:

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 值的处理差异

php依赖注入实例Spring 依附注入三年夜注解年夜揭秘AutowiredResource 和 Inject GraphQL

@Autowired:若未找到匹配的 bean 进行注入,默认情形下注入的字段为 null。
在严格依赖检讨模式下(可配置required属性为true),若未找到匹配 bean 会抛出非常。
@Resource:未找到匹配 bean 时默认也会抛出UnsatisfiedDependencyException非常,但可通过设置required属性为false,使未找到匹配 bean 时注入的字段为 null。
@Inject:未找到匹配 bean 会抛出UnsatisfiedDependencyException非常,且无法像@Autowired和@Resource那样通过设置属性改变对 null 值的处理办法。
编译器提示各不相同

@Autowired:利用时若未找到匹配 bean,编译器常日不会给出明确缺点提示,只有在运行时,依赖检讨模式为严格模式且未找到匹配 bean 才会抛出非常。
例如:若利用@Autowired注入一个不存在的 bean,编译过程可能无缺点提示,但运行时可能涌现NoSuchBeanDefinitionException等非常。
@Resource:同样,未找到匹配 bean 时编译器也不给出明确缺点提示,但若利用时名称或类型不匹配,可能在运行时涌现非常。
例如:利用@Resource注入 bean 但名称或类型禁绝确,运行时可能涌现UnsatisfiedDependencyException等非常。
@Inject:编译时也不会对找不到匹配 bean 的情形给出明确缺点提示,运行时未找到匹配 bean 会抛出非常。
例如:利用@Inject注入不存在的 bean,编译过程无缺点提示,运行时可能涌现UnsatisfiedDependencyException等非常。
依赖注入用法差异

@Autowired:除按类型自动装置外,还可结合@Qualifier表明明确指定要注入的 bean 名称,在有多个相同类型 bean 时非常有用。
示例:

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 名称的办法。
支持参数的不同

@Autowired:可以与@Qualifier、@Value等表明结合利用,供应更多的配置选项。
例如,可以利用@Value注入详细的数值或表达式的值到被注入的工具中。
示例:

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这三个表明的差异,能帮助我们更好地进行依赖注入,选择最适宜项目需求和开拓风格的表明,提升开拓效率和代码质量。