Spring. How bean injection works when there are more than one bean with the same qualifier?












1















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?










share|improve this question



























    1















    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?










    share|improve this question

























      1












      1








      1


      1






      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?










      share|improve this question














      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 18 at 4:51









      luismattorluismattor

      162




      162
























          1 Answer
          1






          active

          oldest

          votes


















          1














          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.






          share|improve this answer








          New contributor




          Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.




















            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
            });


            }
            });














            draft saved

            draft discarded


















            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









            1














            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.






            share|improve this answer








            New contributor




            Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.

























              1














              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.






              share|improve this answer








              New contributor




              Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
              Check out our Code of Conduct.























                1












                1








                1







                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.






                share|improve this answer








                New contributor




                Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.










                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.







                share|improve this answer








                New contributor




                Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                share|improve this answer



                share|improve this answer






                New contributor




                Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                answered Jan 18 at 12:26









                Artur VakhrameevArtur Vakhrameev

                988




                988




                New contributor




                Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.





                New contributor





                Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






                Artur Vakhrameev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






























                    draft saved

                    draft discarded




















































                    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.




                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Liquibase includeAll doesn't find base path

                    How to use setInterval in EJS file?

                    Petrus Granier-Deferre