临沂设计公司有哪些,手机网站图片优化,如何建设企业人力资源网站,领秀网站建设Autowired 和 Resource 的区别是什么#xff1f;
Autowired 属于 Spring 内置的注解#xff0c;默认的注入方式为 byType#xff08;根据类型进行匹配#xff09;#xff0c;也就是说会优先根据接口类型去匹配并注入 Bean #xff08;接口的实现类#xff09;。
这会有…Autowired 和 Resource 的区别是什么
Autowired 属于 Spring 内置的注解默认的注入方式为 byType根据类型进行匹配也就是说会优先根据接口类型去匹配并注入 Bean 接口的实现类。
这会有什么问题呢当一个接口存在多个实现类的话byType 这种方式就无法正确注入对象了因为这个时候 Spring 会同时找到多个满足条件的选择默认情况下它自己不知道选择哪一个。
这种情况下注入方式会变为 byName根据名称进行匹配这个名称通常就是类名首字母小写。下面代码中的 smsService 就是我这里所说的名称。
Autowired
private SmsService smsService;举个例子SmsService 接口有两个实现类: SmsServiceImpl1 和 SmsServiceImpl2且它们都已经被 Spring 容器所管理。
// 例1报错byName 和 byType 都无法匹配到 bean
Autowired
private SmsService smsService;// 例2正确注入 SmsServiceImpl1 对象对应的 bean
Autowired
private SmsService smsServiceImpl1;// 例3正确注入 SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
Autowired
Qualifier(value smsServiceImpl1)
private SmsService smsService;我们还是建议通过 Qualifier 注解来显示指定名称而不是依赖变量的名称。
而 Resource属于 JDK 提供的注解默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话注入方式会变为byType。
Resource 有两个比较重要且日常开发常用的属性name名称、type类型。
public interface Resource {String name() default ;Class? type() default Object.class;
}如果仅指定 name 属性则注入方式为 byName如果仅指定 type 属性则注入方式为 byType如果同时指定 name 和 type 属性不建议这么做则注入方式为 byType byName。
// 报错byName 和 byType 都无法匹配到 bean因为此时有两个实现类
Resource
private SmsService smsService;// 正确注入 SmsServiceImpl1 对象对应的 bean
Resource
private SmsService smsServiceImpl1;// 正确注入 SmsServiceImpl1 对象对应的 bean比较推荐这种方式
Resource(name smsServiceImpl1)
private SmsService smsService;简单总结一下
Autowired 是 Spring 提供的注解Resource 是 JDK 提供的注解。Autowired 默认的注入方式为byType根据类型进行匹配Resource默认注入方式为 byName根据名称进行匹配。当一个接口存在多个实现类的情况下Autowired 和 Resource 都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 Qualifier 注解来显示指定名称Resource可以通过 name 属性来显示指定名称。
参考
Spring中Autowired和Resource的区别Autowired和Resource的区别