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 jakarta.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 jakarta.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 jakarta.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 jakarta.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 ProjectDependencies and Technologies Used: - spring-context 6.1.2 (Spring Context)
Version Compatibility: 4.3.0.RELEASE - 6.1.2 Version compatibilities of spring-context with this example: Versions in green have been tested.
- jakarta.jakartaee-api 10.0.0 (Eclipse Foundation)
- JDK 17
- Maven 3.8.1
|