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