这里是我的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创建一个新实例。
s3Repository()
credentialsProvider()
实际上,它只会创建一个存储库实例。使用 s3Repository() 在您的 @Bean 带注释的方法并没有真正调用该方法,而是告诉spring将已经创建的bean类型(如方法的返回类型所暗示的)注入到 LevelMapper 和 ImageDownloader 您创建的bean。因此,它将在引用该方法的两个bean中注入相同的存储库bean实例。
@Bean
LevelMapper
ImageDownloader
从此处开始 Spring Docs :
全部的 @Configuration 类在启动时使用CGLIB进行子类化。 在子类中,子方法首先检查容器中是否有 在调用父方法并创建 新实例。注意,从Spring 3.2开始,不再需要 将CGLIB添加到类路径中,因为CGLIB类已重新打包 在下面 org.springframework 并直接包含在弹簧芯内 罐子。
@Configuration
org.springframework