循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的。不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 Spring 源码的熟悉程度,因为要把循环依赖这个问题解释清楚,涉及到不少 Spring 源码。
问题比较庞大,今天先来聊聊实例的注入方式。
1. 实例的注入方式
首先来看看 Spring 中的实例该如何注入,总结起来,无非三种:
- 属性注入
- set 方法注入
- 构造方法注入
我们分别来看下。
1.1 属性注入
属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下:
@Servicepublic class BService {@AutowiredAService aService;//...}
这里是使用
@Autowired
注解注入。另外也有
@Resource
以及
@Inject
等注解,都可以实现注入。
不过不知道小伙伴们有没有留意过,在 IDEA 里边,使用属性注入,会有一个警告:
不推荐属性注入!
1.2 set 方法注入
set 方法注入太过于臃肿,实际上很少使用:
@Servicepublic class BService {AService aService;@Autowiredpublic void setaService(AService aService) {this.aService = aService;}}
这代码看一眼都觉得难受,坚决不用。
1.3 构造方法注入
构造方法注入方式如下:
@Servicepublic class AService {BService bService;@Autowiredpublic AService(BService bService) {this.bService = bService;}}
如果类只有一个构造方法,那么
@Autowired
注解可以省略;如果类中有多个构造方法,那么需要添加上
@Autowired
来明确指定到底使用哪个构造方法。
2. 小结
日常开发应该还是属性注入较多代,码该咋写还咋写,Spring 官方的态度了解一下即可,当然,如果项目允许,也不妨试试 Spring 推荐的代码规范。