Closed
Description
Sam Brannen opened SPR-14402 and commented
Status Quo
The support for self-injection via @Autowired
introduced in #13096 works as expected if there is a single candidate bean; however, as soon as there is more than one such candidate self-injection becomes unreliable.
@Primary
and@Priority
have no influence, in contrast to standard autowiring semantics.- Field names do not serve as a fallback qualifier, in contrast to standard autowiring semantics.
- The only work-around appears to be the use of
@Qualifier
for every self-injection point.
Steps to Reproduce
The following test case can be used to experiment with all of the aforementioned failure scenarios.
Running SelfInjectionTests
as is in fact demonstrates that each self
field consistently contains the other bean of type UserService
.
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {
SelfInjectionTests.UserServiceImpl1.class,
SelfInjectionTests.UserServiceImpl2.class
})
public class SelfInjectionTests {
@Autowired
@Qualifier("userService1")
UserService userService1;
@Autowired
@Qualifier("userService2")
UserService userService2;
@Test
public void selfInjection1() {
assertSame(userService1, userService1.getSelf());
}
@Test
public void selfInjection2() {
assertSame(userService2, userService2.getSelf());
}
interface UserService {
UserService getSelf();
}
@Service("userService1")
@Primary
static class UserServiceImpl1 implements UserService {
@Autowired
// @Qualifier("userService1")
private UserService userService1;
public UserService getSelf() {
return this.userService1;
}
@Override
public String toString() {
return "userService1";
}
}
@Service("userService2")
static class UserServiceImpl2 implements UserService {
@Autowired
// @Qualifier("userService2")
private UserService userService2;
public UserService getSelf() {
return this.userService2;
}
@Override
public String toString() {
return "userService2";
}
}
}
Affects: 4.3 GA
Issue Links:
- Support @Autowired-like self injection [SPR-8450] #13096 Support
@Autowired-like
self injection
Referenced from: commits c6752e6