2 beans with same name but in different packages; how to autowire them?

36,410

Solution 1

You will have to give your beans different names - if multiple beans are defined with the same name, then the one defined later will override the one defined earlier - so in your case only one bean will exist with the name of dataTransferHandler.

You can give these two beans different names, so that both can exist and you can inject in the correct one either using: @AutoWired @Qualifier("dataTransferHandler") OR @Resource(name="dataTransferHandler")

Solution 2

You can give attribute primary="true" to the bean defination you want to have the preference when autowired. But the bean names must be different. There is no solution for same bean name.

At run-time when you will get the autowired class then the primary true bean will get the preference for autowiring. Hope this helps you. Cheers.

Share:
36,410
Marco
Author by

Marco

Happy coder, system architect, software geek, cloud believer, tech guy, open-source enthusiasts, wannabe cooking chef, likes to travel, meet new people, share knowledge, and watch movies/series.

Updated on March 04, 2020

Comments

  • Marco
    Marco over 4 years

    I have an application that has 2 beans with the same name, but which are in different packages. My Spring application fails because it cannot decide on which bean to take. Is there any solution for this? The beans do not currently implement specific interfaces.

    See below an edited example of the exception:

    Caused by:
    org.springframework.context.annotation.ConflictingBeanDefinitionException:
    Annotation-specified bean name 'dataTransferHandler' for bean class
    [aaaaa.ws.handler.DataTransferHandler] conflicts with existing,
    non-compatible bean definition of same name and class
    [bbbbb.ws.handler.DataTransferHandler]
    
  • Marco
    Marco about 12 years
    By giving the beans different names you mean changing the class name?
  • Biju Kunjummen
    Biju Kunjummen about 12 years
    No, the bean name - if you explicitly named it <bean name="aName"..>, or if you are using annotations @Service("aName"). It looks like in your case though the two beans have the same name, they are different types either way right
  • Japan Trivedi
    Japan Trivedi over 4 years
    That is what I mentioned in my answer. The solution will work only if bean names are different and there is no solution for beans with same name. Read the answer carefully.
  • Japan Trivedi
    Japan Trivedi over 4 years
    No problem. Thanks.