download:C/C++气象数据中心实战,手把手教你做工业级我的项目附带源码
复制下崽ZY:https://www.zxit666.com/2347/
大家在应用IDEA开发的时候有没有留神到过一个提醒,在字段上应用Spring的依赖注入注解@Autowired后会呈现如下正告
Field injection is not recommended (字段注入是不被举荐的)
然而应用@Resource却不会呈现此提醒
网上文章大部分都是介绍两者的区别,没有提到为什么,过后想了良久想出了可能的起因,明天来总结一下
Spring常见的DI形式
结构器注入:利用构造方法的参数注入依赖
Setter注入:调用Setter的办法注入依赖
字段注入:在字段上应用@Autowired/Resource注解
@Autowired VS @Resource
事实上,他们的基本功能都是通过注解实现依赖注入,只不过@Autowired是Spring定义的,而@Resource是JSR-250定义的。大抵性能基本相同,然而还有一些细节不同:
依赖辨认形式:@Autowired默认是byType能够应用@Qualifier指定Name,@Resource默认ByName如果找不到则ByType
实用对象:@Autowired能够对结构器、办法、参数、字段应用,@Resource只能对办法、字段应用
提供方:@Autowired是Spring提供的,@Resource是JSR-250提供的
各种DI形式的优缺点
参考Spring官网文档,倡议了如下的应用场景:
结构器注入:强依赖性(即必须应用此依赖),不变性(各依赖不会常常变动)
Setter注入:可选(没有此依赖也能够工作),可变(依赖会常常变动)
Field注入:大多数状况下尽量少应用字段注入,肯定要应用的话, @Resource绝对@Autowired对IoC容器的耦合更低
Field注入的毛病
不能像结构器那样注入不可变的对象
依赖对外部不可见,外界能够看到结构器和setter,但无奈看到公有字段,天然无奈理解所需依赖
会导致组件与IoC容器紧耦合(这是最重要的起因,来到了IoC容器去应用组件,在注入依赖时就会十分困难)
导致单元测试也必须应用IoC容器,起因同上
依赖过多时不够显著,比方我须要10个依赖,用结构器注入就会显得宏大,这时候应该考虑一下此组件是不是违反了繁多职责准则
为什么IDEA只对@Autowired正告
Field注入尽管有很多毛病,但它的益处也不可疏忽:那就是太不便了。应用结构器或者setter注入须要写更多业务无关的代码,非常麻烦,而字段注入大幅简化了它们。并且绝大多数状况下业务代码和框架就是强绑定的,齐全松耦合只是一件现实上的事,就义了麻利度去适度谋求松耦合反而得失相当。
那么问题来了,为什么IDEA只对@Autowired正告,却对@Resource熟视无睹呢?
集体认为,就像咱们后面提到过的: @Autowired是Spring提供的,它是特定IoC提供的特定注解,这就导致了利用与框架的强绑定,一旦换用了其余的IoC框架,是不可能反对注入的。而 @Resource是JSR-250提供的,它是Java规范,咱们应用的IoC容器该当去兼容它,这样即便更换容器,也能够失常工作。