来源与默认注入办法
@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 值的处理差异
@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 名称的办法。支持参数的不同
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这三个表明的差异,能帮助我们更好地进行依赖注入,选择最适宜项目需求和开拓风格的表明,提升开拓效率和代码质量。