How @Fallback Redefines Spring Bean Selection in 6.2

This article explains the new @Fallback annotation introduced in Spring 6.2, compares it with @Primary, shows code examples of bean configuration, and details the bean selection order changes before and after the 6.2 release.

Spring Full-Stack Practical Cases
Spring Full-Stack Practical Cases
Spring Full-Stack Practical Cases
How @Fallback Redefines Spring Bean Selection in 6.2

1. Introduction

When multiple beans of the same type exist in the Spring container, the @Primary annotation is used to indicate which bean should be injected by default.

public interface CommonDAO {}
public class UserDAO implements CommonDAO {}
public class PersonDAO implements CommonDAO {}
public class CommonService {
    private CommonDAO dao;
    public CommonService(CommonDAO dao) { this.dao = dao; }
}

@Configuration
public class Module1Config {
    @Bean
    public UserDAO userDAO() { return new UserDAO(); }
    @Bean
    public CommonService commonService(CommonDAO dao) { return new CommonService(dao); }
}

@Configuration
public class Module2Config {
    @Bean
    @Primary
    public PersonDAO personDAO() { return new PersonDAO(); }
}

Other ways besides @Primary exist; see related articles for alternatives.

2. New Feature: @Fallback

Spring 6.2 introduces the @Fallback annotation, which marks a bean as a fallback candidate and serves as an alternative to @Primary. If several candidates are marked as fallback, the remaining beans are selected. The fallback works only when a single injection point has multiple candidates; for collections, all matching beans are included.

@Configuration
public class AppConfig {
    @Bean
    public UserDAO userDAO() { return new UserDAO(); }
    @Bean
    @Fallback
    public PersonDAO personDAO() { return new PersonDAO(); }
    @Bean
    public CommonService commonService(CommonDAO dao) { return new CommonService(dao); }
}

In this example, CommonService receives UserDAO; if UserDAO is absent, the PersonDAO marked with @Fallback will be injected.

If multiple beans are marked @Fallback without a default, injection for a single point will fail.

@Bean
@Fallback
public UserDAO userDAO() { return new UserDAO(); }

@Bean
@Fallback
public PersonDAO personDAO() { return new PersonDAO(); }

When one bean is @Fallback and another is @Primary, @Primary takes precedence.

@Fallback
public UserDAO userDAO() { }

@Primary
public PersonDAO personDAO() { }

Bean Selection Order in Spring 6.2

@Primary (searched first, then non‑@Fallback)

Match by field or parameter name

@Qualifier (specified value name)

@Priority

Directly registered dependencies (static registration)

Bean Selection Order before Spring 6.2

@Primary

@Priority

Directly registered dependencies

Direct registration can be done manually, for example:

// manual BeanFactory creation
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerResolvableDependency(CommonDAO.class, TeacherDAO.class);

That concludes the article.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

dependency-injectionbeanFallbackPrimary
Spring Full-Stack Practical Cases
Written by

Spring Full-Stack Practical Cases

Full-stack Java development with Vue 2/3 front-end suite; hands-on examples and source code analysis for Spring, Spring Boot 2/3, and Spring Cloud.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.