为什么 Spring 和 IDEA 都不保举使用 @Autowired 注解?

开发者 2024-10-4 06:20:45 16 0 来自 中国
各人在使用IDEA开辟的时间有没有留意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如下告诫
Field injection is not recommended (字段注入是不被保举的)
但是使用@Resource却不会出现此提示
网上文章大部门都是先容两者的区别,没有提到为什么,本日来总结一下
01

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提供的
02

各种DI方式的优缺点
参考Spring官方文档,发起了如下的使用场景:

  • 构造器注入:强依赖性(即必须使用此依赖),稳固性(各依赖不会常常变动)
  • Setter注入:可选(没有此依赖也可以工作),可变(依赖会常常变动)
  • Field注入:大多数情况下只管少使用字段注入,肯定要使用的话, @Resource相对@Autowired对IoC容器的耦合更低
03

Field注入的缺点

  • 不能像构造器那样注入不可变的对象
  • 依赖对外部不可见,外界可以看到构造器和setter,但无法看到私有字段,自然无法相识所需依赖
  • 会导致组件与IoC容器紧耦合(这是最告急的缘故原由,脱离了IoC容器去使用组件,在注入依赖时就会非常困难)
  • 导致单元测试也必须使用IoC容器,缘故原由同上
  • 依赖过多时不敷显着,比如我须要10个依赖,用构造器注入就会显得巨大,这时间应该思量一下此组件是不是违背了单一职责原则
为什么IDEA只对@Autowired告诫
Field注入固然有许多缺点,但它的好处也不可忽略:那就是太方便了。使用构造器或者setter注入须要写更多业务无关的代码,非常贫苦,而字段注入大幅简化了它们。而且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是一件理想上的事,捐躯了敏捷度去太过追求松耦合反而得不偿失。IDE激活:blog.idejihuo.com
那么标题来了,为什么IDEA只对@Autowired告诫,却对@Resource视而不见呢?
个人以为,就像我们前面提到过的:@Autowired是Spring提供的,它是特定IoC提供的特定注解,这就导致了应用与框架的强绑定,一旦换用了其他的IoC框架,是不可以或许支持注入**的。
而 @Resource是JSR-250提供的,它是Java标准,我们使用的IoC容器应当去兼容它,如许纵然更换容器,也可以正常工作。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:52, Processed in 0.171171 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表