在使用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注入需要写更多业务无关的代码,非常麻烦,而字段注入简化了他们,并且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是理想情况,牺牲了敏捷度而过度所求松耦合反而得不偿失