4.2. Referencing beans across @Configuration classes

One configuration class may need to reference a bean defined in another configuration class (or in XML, for that matter). The preferred mechanism for doing this is using Spring's @Autowired annotation:

4.2.1. Direct bean references with @Autowired

One @Configuration class may directly reference bean instances registered from another using Spring's @Autowired annotation.

@Configuration
public class ConfigOne {
    @Bean
    public AccountRepository accountRepository() {
        // create and return an AccountRepository object
    }
}

@Configuration
@AnnotationDrivenConfig
public class ConfigTwo {
    @Autowired AccountRepository accountRepository;

    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl(accountRepository);
    }
}
                

Given that both these configuration classes are supplied to the application context at runtime, the AccountRepository bean declared in ConfigOne will be autowired (injected) into the AccountRepository field in ConfigTwo.

JavaConfigApplicationContext context =
    new JavaConfigApplicationContext(ConfigOne.class, ConfigTwo.class);
                

4.2.2. Fully-qualified bean references with @Autowired

In addition to being able to reference any particular bean definition as seen above, one @Configuration class may reference the instance of any other @Configuration class using @Autowired. This works because the @Configuration classes themselves are instantiated and managed as individual Spring beans.

@Configuration
public class ConfigOne {
    @Bean
    public AccountRepository accountRepository() {
        // create and return an AccountRepository object
    }
}

@Configuration
@AnnotationDrivenConfig
public class ConfigTwo {
    @Autowired ConfigOne configOne;

    @Bean
    public TransferService transferService() {
         // transferService references accountRepository in a 'fully-qualified' fashion:
        return new TransferServiceImpl(configOne.accountRepository());
    }
}
                

[Tip]Tip
The 'fully-qualified' approach is generally preferred as it provides a the significant advantage of being able to easily navigate within an IDE to the source of the referenced bean.

Open issue: Should @AnnotationDrivenConfig be enabled by default? Rationale: given that @Autowired is the preferred method for referencing external beans, it is likely to need to be enabled in all but the most trivial configurations. See SJC-219.