Close

Spring - Injecting beans Into Arrays and Lists, ordering with @Ordered annotation

[Last Updated: Jun 11, 2021]

While injecting beans into Array and List, the elements can be ordered by using @Order annotation.

Definition of @Order annotation

package org.springframework.core.annotation;
 .......
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
    int value() default 2147483647;
}

Examples

Beans using @Order annotation

package com.logicbig.example.beans;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

public interface Account {
}

@Component
@Order(1)
class SavingAccount implements Account {
    @Override
    public String toString() {
        return "SavingAccount";
    }
}

@Component
@Order(3)
class CheckingAccount implements Account {
    @Override
    public String toString() {
        return "CheckInAccount";
    }
}

@Component
@Order(2)
class FixedDepositAccount implements Account {
    @Override
    public String toString() {
        return "FixedDepositAccount";
    }
}

Injecting Ordered elements into Array

package com.logicbig.example;

import com.logicbig.example.beans.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.Arrays;

@Configuration
@ComponentScan(basePackages = "com.logicbig.example.beans")
public class InjectingArrayOfBeansExample {

    @Bean
    public TestBean testBean(){
        return new TestBean();
    }

    private static class TestBean {
        @Autowired
        private Account[] accounts;

       @PostConstruct
        public void init() {
           System.out.println(Arrays.toString(accounts));
        }
    }

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(
                InjectingArrayOfBeansExample.class);
    }
}

Output

[SavingAccount, FixedDepositAccount, CheckInAccount]

Injecting Ordered elements into List

package com.logicbig.example;

import com.logicbig.example.beans.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.List;

@Configuration
@ComponentScan(basePackages = "com.logicbig.example.beans")
public class InjectingListOfBeansExample {

    @Bean
    public TestBean testBean() {
        return new TestBean();
    }

    private static class TestBean {
        @Autowired
        private List<Account> accounts;

        @PostConstruct
        public void init() {
            System.out.println(accounts);
        }
    }

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(
                InjectingListOfBeansExample.class);
    }
}

Output

[SavingAccount, FixedDepositAccount, CheckInAccount]

Ordering specified by @Order annotations is ignored by Set and Map

package com.logicbig.example;

import com.logicbig.example.beans.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.Set;

@Configuration
@ComponentScan(basePackages = "com.logicbig.example.beans")
public class InjectingSetOfBeansExample {

    @Bean
    public TestBean testBean() {
        return new TestBean();
    }

    private static class TestBean {
        @Autowired
        private Set<Account> accounts;

        @PostConstruct
        public void init() {
            System.out.println(accounts);
        }
    }

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(
                InjectingSetOfBeansExample.class);
    }
}

Output

[CheckInAccount, FixedDepositAccount, SavingAccount]
package com.logicbig.example;

import com.logicbig.example.beans.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.Map;

@Configuration
@ComponentScan(basePackages = "com.logicbig.example.beans")
public class InjectingMapOfBeansExample {

    @Bean
    public TestBean testBean() {
        return new TestBean();
    }

    private static class TestBean {
        @Autowired
        private Map<String, Account> accounts;

        @PostConstruct
        public void init() {
            System.out.println(accounts);
        }
    }

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(
                InjectingMapOfBeansExample.class);
    }
}

Output

{checkingAccount=CheckInAccount, fixedDepositAccount=FixedDepositAccount, savingAccount=SavingAccount}

Example Project

Dependencies and Technologies Used:

  • spring-context 5.3.8: Spring Context. Version Compatibility: 4.3.0.RELEASE - 5.3.8 Version List
    ×

    Version compatibilities of spring-context with this example:

    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8

    Versions in green have been tested.

  • JDK 8
  • Maven 3.8.1

Ordering Arrays/List with @Ordered annotation Select All Download
  • spring-arrays-and-collection-of-beans-with-ordering
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • beans
                  • Account.java

    See Also