Spring. How bean injection works when there are more than one bean with the same qualifier?
Lets assume you have the following Classes extending the Processor interface:
Interface Processor {}
class ProcesorImpl1 implements Processor {}
class ProcesorImpl2 implements Processor {}
Now, Lets assume that you define the following bean in a configuration class in package1:
class ConfigurationClass1 {
@Bean
@Qualifier("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
Next, you define the following bean in a configuration class in package2:
class ConfigurationClass2 {
@Bean
@Qualifier("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
The question is how does Spring resolves the following Injection:
@Inject @Qualifier("processor") proc;
What if one of the Beans are annotated with @Primary?
spring dependency-injection
add a comment |
Lets assume you have the following Classes extending the Processor interface:
Interface Processor {}
class ProcesorImpl1 implements Processor {}
class ProcesorImpl2 implements Processor {}
Now, Lets assume that you define the following bean in a configuration class in package1:
class ConfigurationClass1 {
@Bean
@Qualifier("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
Next, you define the following bean in a configuration class in package2:
class ConfigurationClass2 {
@Bean
@Qualifier("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
The question is how does Spring resolves the following Injection:
@Inject @Qualifier("processor") proc;
What if one of the Beans are annotated with @Primary?
spring dependency-injection
add a comment |
Lets assume you have the following Classes extending the Processor interface:
Interface Processor {}
class ProcesorImpl1 implements Processor {}
class ProcesorImpl2 implements Processor {}
Now, Lets assume that you define the following bean in a configuration class in package1:
class ConfigurationClass1 {
@Bean
@Qualifier("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
Next, you define the following bean in a configuration class in package2:
class ConfigurationClass2 {
@Bean
@Qualifier("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
The question is how does Spring resolves the following Injection:
@Inject @Qualifier("processor") proc;
What if one of the Beans are annotated with @Primary?
spring dependency-injection
Lets assume you have the following Classes extending the Processor interface:
Interface Processor {}
class ProcesorImpl1 implements Processor {}
class ProcesorImpl2 implements Processor {}
Now, Lets assume that you define the following bean in a configuration class in package1:
class ConfigurationClass1 {
@Bean
@Qualifier("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
Next, you define the following bean in a configuration class in package2:
class ConfigurationClass2 {
@Bean
@Qualifier("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
The question is how does Spring resolves the following Injection:
@Inject @Qualifier("processor") proc;
What if one of the Beans are annotated with @Primary?
spring dependency-injection
spring dependency-injection
asked Jan 18 at 4:51
luismattorluismattor
162
162
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Qualifier
doesn't work with @Bean
annotation, but @Primary
does and it will define what concrete bean will be injected if you inject a bean by type and there is multiple bean of this type managed by Spring. If you want to inject another non-primary bean, you can mark it with @Qualifier("beanName")
annotation to inject it by name.
If you define 2 bean with the same names and the same types like this
class ConfigurationClass1 {
@Bean("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
class ConfigurationClass2 {
@Bean("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
Spring will override the first loaded bean within the second and only single will stay in container, because of allowBeanDefinitionOverriding
property is set to true
by default.
New contributor
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54247932%2fspring-how-bean-injection-works-when-there-are-more-than-one-bean-with-the-same%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Qualifier
doesn't work with @Bean
annotation, but @Primary
does and it will define what concrete bean will be injected if you inject a bean by type and there is multiple bean of this type managed by Spring. If you want to inject another non-primary bean, you can mark it with @Qualifier("beanName")
annotation to inject it by name.
If you define 2 bean with the same names and the same types like this
class ConfigurationClass1 {
@Bean("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
class ConfigurationClass2 {
@Bean("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
Spring will override the first loaded bean within the second and only single will stay in container, because of allowBeanDefinitionOverriding
property is set to true
by default.
New contributor
add a comment |
Qualifier
doesn't work with @Bean
annotation, but @Primary
does and it will define what concrete bean will be injected if you inject a bean by type and there is multiple bean of this type managed by Spring. If you want to inject another non-primary bean, you can mark it with @Qualifier("beanName")
annotation to inject it by name.
If you define 2 bean with the same names and the same types like this
class ConfigurationClass1 {
@Bean("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
class ConfigurationClass2 {
@Bean("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
Spring will override the first loaded bean within the second and only single will stay in container, because of allowBeanDefinitionOverriding
property is set to true
by default.
New contributor
add a comment |
Qualifier
doesn't work with @Bean
annotation, but @Primary
does and it will define what concrete bean will be injected if you inject a bean by type and there is multiple bean of this type managed by Spring. If you want to inject another non-primary bean, you can mark it with @Qualifier("beanName")
annotation to inject it by name.
If you define 2 bean with the same names and the same types like this
class ConfigurationClass1 {
@Bean("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
class ConfigurationClass2 {
@Bean("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
Spring will override the first loaded bean within the second and only single will stay in container, because of allowBeanDefinitionOverriding
property is set to true
by default.
New contributor
Qualifier
doesn't work with @Bean
annotation, but @Primary
does and it will define what concrete bean will be injected if you inject a bean by type and there is multiple bean of this type managed by Spring. If you want to inject another non-primary bean, you can mark it with @Qualifier("beanName")
annotation to inject it by name.
If you define 2 bean with the same names and the same types like this
class ConfigurationClass1 {
@Bean("processor")
public Processor processor() {
return new ProcesorImpl1();
}
}
class ConfigurationClass2 {
@Bean("processor")
public Processor anotherProcessor() {
return new ProcesorImpl2();
}
}
Spring will override the first loaded bean within the second and only single will stay in container, because of allowBeanDefinitionOverriding
property is set to true
by default.
New contributor
New contributor
answered Jan 18 at 12:26
Artur VakhrameevArtur Vakhrameev
988
988
New contributor
New contributor
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54247932%2fspring-how-bean-injection-works-when-there-are-more-than-one-bean-with-the-same%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown