7.12.5 Composing Java-based configurations

使用@Import 注解

与Spring XML文件的<import/>很像,@Import注解允许你加载别的配置类

@Configuration
public class ConfigA{
    @Bean
    public A a(){
        return new A();
    }
}

@Configuration
@Import(ConfigA.class)
public class ConfigB{
    @Bean
    public B b(){
        return new B();
    }
}

现在,你不用指定ConfigA.class 和 ConfigB.class当初始化上下文时,仅需要显示的提供ConfigB就可以了

public static void main(String[] args){
    Application ctx = new AnnotationConfigApplicationContext(ConfigB.class);
    A a = ctx.getBean(A.class);
    B b = ctx.getBean(B.class);
}

开发者仅需要处理一个类,而不需要开发者记住大量的@Configuration类

Spring4.2 @Import也支持

Injecting dependencies on imported @Bean definitions

@Configuration
public class ServiceConfig{

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

@Configuration
public class RepositoryConfig{

    @Bean
    public AccountRepository accountRepository(DataSource dataSource){
        return new JdbcAccountRepository(dataSource);
    }
}

@Configruation
@Import({ServiceConfig.class, RepositoryConfig.class})
public class SystemTestConfig{

    @Bean
    public DataSource dataSource(){
        //return new DataSource
    }

    public static void main(String[] args){
        Application ctx = new AnnotationConfigApplicatoinContext(SystemTestConfig.class);
        TransferService transferService = ctx.getBean(TransferService.class);
    }
}

在配置类中也可以使用@Autowired和@Value

@Configuration
public class ServiceConfig{

    @Autowired
    private AccountRepository accountRepository;

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

@Configuration
public class RepositoryConfig{
    private final DataSource dataSource;

    @Autowired
    public RepositoryConfig(DataSource dataSource){
        this.dataSource = dataSource;
    }

    @Bean
    public AccountRepository accountRepository(){
        return new JdbcAccountRepository(dataSource);
    }
}

@Configuration
@Import({ServiceConfig.class, RepositoryConfig.class})
public class SystemTesstConfig{
    @Bean
    public DataSource dataSource(){
        //return new DataSource
    }
}

public static void main(String[] args){
    ApplicationContext ctx = new AnnotationConfigApplicatonContext(SystemTestConfig.class);
    ctx.getBean(TransferService.class);
}

未完

results matching ""

    No results matching ""