Close

Spring - Autowiring By Name, Using Autowire.BY_NAME

[Last Updated: Nov 28, 2020]

In this mode, beans are matched by names. Names are nothing but the identifier of the beans.

We have to use @Autowired at the injection point in this mode.

Using default bean name

In the following example, even though there are two beans available of same type, there will still be a valid match for the injection point field Service serviceBean1. That's because by default, the beans are registered as the 'method name' annotated with @Bean unless we use the 'name' element of @Bean.

Using explicit bean name

We can also specify an explicit bean name using 'name' element of the @Bean

We can use setter based or constructor based autowiring as well, still the filed name (bean property) has to match.

We would typically want to use this mode of wiring, if there are multiple beans available of same type which likely to cause NoUniqueBeanDefinitionException (thrown for both Autowire.NO and Autowire.BY_TYPE modes). Using bean's name (the identifier) is a way to resolve ambiguity.

We can also use @Qualifier instead of matching by 'name'. There, we have to use the same qualifier at the injection point. In that case using the mode won't be significant any more because we will be matching by a qualifier not by name.

Examples

Using default bean name

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

public class AutowireByName {

    public static void main (String[] args) {
        AnnotationConfigApplicationContext context = new
                            AnnotationConfigApplicationContext(Config.class);
        ClientBean bean = context.getBean(ClientBean.class);
        bean.doSomething();
    }

    @Configuration
    public static class Config {

        @Bean(autowire = Autowire.BY_NAME)
        public ClientBean clientBean () {
            return new ClientBean();
        }

        @Bean
        public ServiceBean serviceBean1 () {
            return new ServiceBean("Service bean 1");
        }

        @Bean
        public ServiceBean serviceBean2 () {
            return new ServiceBean("Service bean 2");
        }
    }

    private static class ClientBean {
        @Autowired
        private ServiceBean serviceBean1;

        public void doSomething () {
            System.out.println(serviceBean1.getMsg());
        }
    }

    private static class ServiceBean {
        private String msg;

        public ServiceBean (String msg) {
            this.msg = msg;
        }

        public String getMsg () {
            return msg;
        }
    }
}

Output

Service bean 1

Specifying name via @Bean#name

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


public class AutowireByName2 {

    public static void main (String[] args) {
        AnnotationConfigApplicationContext context = new
                            AnnotationConfigApplicationContext(Config.class);
        ClientBean bean = context.getBean(ClientBean.class);
        bean.doSomething();
    }

    @Configuration
    public static class Config {

        @Bean(autowire = Autowire.BY_NAME)
        public ClientBean clientBean () {
            return new ClientBean();
        }

        @Bean(name = "someOtherServiceBean")
        public ServiceBean serviceBean1 () {
            return new ServiceBean("Service bean 1");
        }

        @Bean
        public ServiceBean serviceBean2 () {
            return new ServiceBean("Service bean 2");
        }
    }

    private static class ClientBean {
        private ServiceBean someOtherServiceBean;

        @Autowired
        public void setSomeOtherServiceBean (ServiceBean serviceBean) {
            this.someOtherServiceBean = serviceBean;
        }

        public void doSomething () {
            System.out.println(someOtherServiceBean.getMsg());
        }
    }

    private static class ServiceBean {
        private String msg;

        public ServiceBean (String msg) {
            this.msg = msg;
        }

        public String getMsg () {
            return msg;
        }
    }
}

Output

Service bean 1

Using @Qualifier

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


public class AutowireByName3 {

    public static void main (String[] args) {
        AnnotationConfigApplicationContext context = new
                            AnnotationConfigApplicationContext(Config.class);
        ClientBean bean = context.getBean(ClientBean.class);
        bean.doSomething();
    }

    @Configuration
    public static class Config {

        @Bean(autowire = Autowire.BY_NAME)
        public ClientBean clientBean () {
            return new ClientBean();
        }

        @Bean
        public ServiceBean serviceBean1 () {
            return new ServiceBean("Service bean 1");
        }

        @Bean(name = "myService")
        public ServiceBean serviceBean2 () {
            return new ServiceBean("Service bean 2");
        }
    }

    private static class ClientBean {
        private ServiceBean serviceBean;

        @Autowired
        @Qualifier("myService")
        public void setServiceBean(ServiceBean serviceBean) {
            this.serviceBean = serviceBean;
        }

        public void doSomething () {
            System.out.println(serviceBean.getMsg());
        }
    }

    private static class ServiceBean {
        private String msg;

        public ServiceBean (String msg) {
            this.msg = msg;
        }

        public String getMsg () {
            return msg;
        }
    }
}

Output

Service bean 2

Using @Qualifier at both injection point and at bean definition

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


public class AutowireByName4 {

    public static void main (String[] args) {
        AnnotationConfigApplicationContext context = new
                            AnnotationConfigApplicationContext(Config.class);
        ClientBean bean = context.getBean(ClientBean.class);
        bean.doSomething();
    }

    @Configuration
    public static class Config {

        @Bean(autowire = Autowire.BY_NAME)
        public ClientBean clientBean () {
            return new ClientBean();
        }

        @Bean
        public ServiceBean serviceBean1 () {
            return new ServiceBean("Service bean 1");
        }

        @Bean
        @Qualifier("myService")
        public ServiceBean serviceBean2 () {
            return new ServiceBean("Service bean 2");
        }
    }

    private static class ClientBean {
        private ServiceBean serviceBean;

        @Autowired
        @Qualifier("myService")
        public void setServiceBean(ServiceBean serviceBean) {
            this.serviceBean = serviceBean;
        }

        public void doSomething () {
            System.out.println(serviceBean.getMsg());
        }
    }

    private static class ServiceBean {
        private String msg;

        public ServiceBean (String msg) {
            this.msg = msg;
        }

        public String getMsg () {
            return msg;
        }
    }
}

Output

Service bean 2

Example Project

Dependencies and Technologies Used:

  • spring-context 4.2.3.RELEASE: Spring Context.
  • JDK 1.8
  • Maven 3.6.3

Spring - Autowire.BY_NAME Example Select All Download
  • spring-autowire-by-name
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • AutowireByName.java

    See Also