Spring JavaConfig如何引用我已定义的bean来创建新bean

时间:2015-03-02 21:43:24

标签: java spring spring-java-config

这是我的Applications bean定义的摘录,我希望能够引用我定义的bean。

@Configuration
@ComponentScan({"com.abc.config", "com.abc.config.common"})
public class ApplicationConfig {
    @Bean(name = "AWSCredentialsProvider")
    AWSCredentials credentialsProvider() { return new AWSCredentials(/*Omitted*/); }  
    @Bean(name = "DynamoDBClient")
    AmazonDynamoDBClient dynamoDBClient() {
        AmazonDynamoDBClient dynamoDB = new AmazonDynamoDBClient(credentialsProvider());
        return dynamoDB;        
    }  
    @Bean S3Repository s3Repository() {
        AmazonS3 s3 = new AmazonS3Client(credentialsProvider());
        return new S3Repository(s3);
    }  
    @Bean LevelMapper levelMapper() { return new LevelMapper(s3Repository()); }
    @Bean ImageDownloader imageDownloader() { return new ImageDownloader(s3Repository()); }
}

现在我正在做的是在两个地方调用像s3Repository()这样的方法;这样我就可以创建两个存储库实例,而我希望整个应用程序只有一个实例。像credentialsProvider()这样的东西是轻量级的,所以我不介意为每个bean创建一个新的实例。

1 个答案:

答案 0 :(得分:2)

实际上它只会创建一个存储库实例。在s3Repository()带注释的方法中使用@Bean并不真正调用该方法,只是告诉spring将已创建的bean类型(如方法的返回类型所暗示)注入{{1你创建的和LevelMapper bean。因此,它将在引用该方法的两个bean中注入相同的存储库bean实例。

从此Spring Docs

  

所有ImageDownloader类在启动时都使用CGLIB进行子类化。   在子类中,子方法首先检查容器是否为any   缓存(作用域)bean在调用父方法并创建一个   新实例。请注意,从Spring 3.2开始,不再需要   将CGLIB添加到类路径中,因为CGLIB类已被重新打包   在@Configuration下并直接包含在spring-core中   JAR。