繁体   English   中英

Spring JavaConfig我如何引用为创建新bean而定义的bean

[英]Spring JavaConfig how do I refer to beans that I have defined to create new beans

这是我的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创建一个新实例。

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

从这个春季文件

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM