为什么Spring和IDEA都不推荐使用@Autowired注解

在使用IDEA开发时,如果 在字段上使用Spring的依赖注解@Autowired后会出现如下警告

Field injection is not recommended(字段注入是不被推荐的)

但是使用@Resource 却不会出现此提示, 至于是什么原因,我们一起看看

Spring 常见的DI(依赖注入)方式

(1)构造器注入:利用构造方法的参数注入依赖

(2)Setter注入:调用Setter的方法注入依赖

(3)字段注入:在字段上使用@Autowired 或 @Resource 注解

@Autowired VS @Resource

事实上,他们的基本功能都是通过注解实现依赖注入,只不过@Autowired是Spring定义的,而@Resoure是JSR-250定义的,大致功能基本相同,但还是有一些细节不同

(1)依赖识别方法:

        @Autowired默认是byType,可以使用@Qualifier指定name

        @Resource默认是byName, 如果找不到则会 byType

(2)适用对象

        @Autowired可以对构造器,方法,参数,字段使用

        @Resource只能对方法,字段使用

(3)提供方

        @Autowired是Spring提供

        @Resource是JSR-250提供

各种DI方式的优缺点

        (1)构造器注入:强依赖性(即必须使用此依赖), 不变性(各依赖不会经常变动)

        (2)Setter注入:可选(没有此依赖也可以工作), 可变(依赖会经常变动)

        (3)Field注入:大多数情况下尽量少使用字段注入,一定要使用的话, @Resource相对@Autowired对IOC容器的耦合更低

Field注入的缺点

(1)不能像构造器那样注入不可变的对象

(2)依赖对外部不可见,外界可以看到构造器和Setter,但无法看到私有字段,自然无法了解所需依赖

(3)会导致组件与IOC容器紧耦合(这是最重要的原因,离开了IOC容器去使用组件,在注入依赖时就会十分困难)

(4)导致单元测试也必须使用IOC容器

(5)依赖过多时不够明显,比如我们需要10个依赖,用构造器注入就会显示庞大,这时应该考虑一下此组件是不是违反了单一职责原则

Field注入虽然有很多缺点,但这的好处也不可忽略,那就是方便, 使用构造器或Setter注入需要写更多业务无关的代码,非常麻烦,而字段注入简化了他们,并且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是理想情况,牺牲了敏捷度而过度所求松耦合反而得不偿失

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值