代码之家  ›  专栏  ›  技术社区  ›  nikhil

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

  •  1
  • nikhil  · 技术社区  · 11 年前

    这里是我的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 回复  |  直到 11 年前
        1
  •  2
  •   Rohit Jain    11 年前

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

    从此处开始 Spring Docs :

    全部的 @Configuration 类在启动时使用CGLIB进行子类化。 在子类中,子方法首先检查容器中是否有 在调用父方法并创建 新实例。注意,从Spring 3.2开始,不再需要 将CGLIB添加到类路径中,因为CGLIB类已重新打包 在下面 org.springframework 并直接包含在弹簧芯内 罐子。