4.2. Referencing beans across @Configuration classes
Prev | 4. Modularizing configurations | Next

## 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
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.

Prev | Up | Next
4. Modularizing configurations | Home | 4.3. Aggregating @Configuration classes with @Import