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 特定的警告,例如关于字段注入的警告