为什么可以使用@Resource,但不推荐使用@Autowired

avatar
作者
猴君
阅读量:0

DI注入的三种方式
1、属性注入
属性注入应该是我们用的最多的一种,即通过@Autowired注解,该注解默认是按照ByType方式(按类型)注入Bean,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)。示例代码:

@Service public class UserService {     private static User user;     // 1. Filed Injection 属性注入     @Autowired     private PlayService playService; } 

2、setter 方法注入
setter方式也会用到@Autowired注解,不过是用在成员属性的set方法上

// 2. Setter Injection setter注入 private PlayService playService; @Autowired public void setPlayService(PlayService playService) {     this.playService = playService; } 

3、构造器注入
构造器注入,则是把需要注入的对象,通过构造器来进行初始化

 	private PlayService playService; 		UserService(PlayService playService) {    		 this.playService = playService; } 
 @Component   public interface PlayService {       void play();   }    @Component   @Slf4j   public class Mp3Player implements PlayService {        @Override       public void play() {           log.info("Mp3Player play()");       }   }    @Component   @Slf4j   public class Mp4Player implements PlayService {        @Override       public void play() {           log.info("Mp4Player play()");       }   } 

区别:
1、@Resource是Java的标准注解,定义在javax.annotation.Resource包中,主要用于EJB 组件的依赖注入,但在Spring中也可以用于bean的注入。
2、@Autowired 是 Spring 框架提供的注解,定义在org.springframework.beans.factory.annotation.Autowired 包中,专门用于 Spring 环境下的依赖注入。
3、@Resource 默认按照名称进行注入,如果找不到匹配名称的 bean,则退而求其次按照类型进行注入。可以通过 name 属性指定 bean 名称,或者通过 lookup 属性指定查找方法。
4、@Autowired 默认按照类型进行注入,如果类型匹配的 bean 多于一个,则会抛出异常,除非指定了具体的 bean 名称。可以通过 required 属性来控制是否必须找到匹配的 bean。
5、IDEA推荐@Resource
(1)@Resource 是 Java 标准的一部分,因此可能被视为更通用的解决方案
(2)使用 @Resource 可以避免 Spring 的特定依赖,使得代码看起来与 Spring 解耦。 IDEA 的推荐也可能基于减少 Spring 特定的警告,例如关于字段注入的警告

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!