使用IDEA开发的时候有没有注意到提示?在字段上使用Spring的依赖注入注解@Autowired后,会出现如下警告Fieldinjectionisnotrecommended(不推荐字段注入)但是使用@Resource但是不会出现这个提示,网上大部分文章介绍了两者的区别,不说为什么,今天就总结一下1.Spring常用的DI方法构造函数注入:利用构造方法的参数注入依赖Setter注入:调用Setter方法注入依赖字段注入:在字段上使用@Autowired/Resource注解@AutowiredVS@Resource其实它们的基本功能都是通过注解实现依赖注入,只不过@Autowired是Spring定义的,而@Resource是JSR-250定义的。大体功能基本相同,但在细节上有一些区别:依赖识别方式:@Autowired默认为byType,可以使用@Qualifier指定Name,@Resource默认为ByName,如果找不到,ByType适用于objects:@Autowired可以用于构造函数、方法、参数和字段,@Resource只能用于方法和字段的providers:@Autowired是Spring提供的,@Resource是JSR-250提供的2.优缺点各种DI方法参考Spring官方文档,建议如下使用场景:构造函数注入:强依赖(即必须使用这个依赖),不可变性(每个依赖不会频繁变化)Setter注入:可选(可以workwithoutthisdependency),variable(dependency会经常变化)Fieldinjection:大多数情况下,尽量少用fieldinjection。如果必须使用它,@Resource与IoC容器的耦合程度低于@Autowired。3、Field注入的缺点是不能像构造函数那样注入不可变对象。可见外界可以看到constructor和setter,但是看不到privatefields。自然就无法理解需要的依赖,会导致组件和IoC容器紧耦合(这是最重要的原因,离开IoC容器去使用组件,在注入依赖的时候会很吃力it)这样单元测试也必须使用IoC容器。原因是当依赖太多的时候不明显。为什么IDEA只警告@AutowiredField注入有很多缺点,但是它的好处也不容忽视:太方便了。使用constructor或者setter注入需要写更多业务无关的代码,非常麻烦,而字段注入大大简化了它们。而且在大多数情况下,业务代码和框架是强绑定的,完全的松散耦合只是理想中的事情,牺牲敏捷性去过度追求松散耦合是得不偿失的。IDE激活:blog.idejihuo.com那么问题来了,为什么IDEA只警告@Autowired,而忽略了@Resource?在我看来,正如我们前面提到的:@Autowired是由Spring提供的,它是由特定的IoC提供的特定注解,从而导致应用程序和框架之间的强绑定。一旦切换到其他IoC框架,是不能支持注入**。而@Resource是由JSR-250提供的,它是一个Java标准。我们使用的IoC容器要与之兼容,这样即使更换了容器也能正常工作。
