Skip to content

Define and document rules for @Autowired self-injection in case of ambiguity [SPR-14402] #18973

Closed
@spring-projects-issues

Description

@spring-projects-issues

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.

  1. @Primary and @Priority have no influence, in contrast to standard autowiring semantics.
  2. Field names do not serve as a fallback qualifier, in contrast to standard autowiring semantics.
  3. 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:

Referenced from: commits c6752e6

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)type: taskA general task

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions