1 什么是依赖注入
在软件工程中,依赖注入是一种对象提供另一对象的依赖性的技术。依赖关系是可以使用的对象(服务)。注入是将依赖关系传递给将使用它的依赖对象(客户端)。
2 为什么使用构造方法注入
使用Spring提供的@Autowired注解,我们可以通过标记构造方法(constructor)、域(field)、setter方法和配置方法(config methods)来实现依赖注入。我们使用较多的是标记域的方式,这使得客户端可以创建该类的不合法的实例,不利于问题排查和测试,这一点在Oliver Gierke的Why field injection is evil的文章中已有说明。
3 如何使用构造方法注入
结合Lombok注解使用构造方法注入可简化代码:
@Service
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) //注意点1
public class OssSyncService {
private final @NonNull //注意点2
OssSyncObjectRepository ossSyncObjectRepository;
private final @NonNull
OssSyncInfoRepository ossSyncInfoRepository;
private final @NonNull
S3Config s3Config;
//其余省略
}
- 注意点1-类前标注@RequiredArgsConstructor(onConstructor = @__(@Autowired))
- 注意点2-依赖的Bean使用private final修饰符和@NonNull注解
4 参考
- http://olivergierke.de/2013/11/why-field-injection-is-evil/
- https://wiki.yziyz.xin:82/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC
- https://en.wikipedia.org/wiki/Dependency_injection
- https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html
- https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html