2015-03-02 2 views
1

Вот выдержка из моего определения компонентов приложений, я хочу иметь возможность ссылаться на beans, которые я определил.Spring JavaConfig как я могу ссылаться на beans, которые я определил для создания новых 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() является легким, поэтому я не возражаю против создания нового экземпляра для каждого компонента.

ответ

2

На самом деле это создаст только один экземпляр хранилища. Использование s3Repository() в вашем аннотированном методе @Bean на самом деле не вызывает этот метод, но просто сообщает весне вставить уже созданный bean-тип типа (как подразумевается методом возвращаемого метода) в созданный вами компонент и ImageDownloader. Таким образом, он будет вводить один и тот же экземпляр bepository bean в обоих компонентах, ссылающихся на этот метод.

Из этого Spring Docs:

Все @Configuration классы подклассы при запуске времени с CGLIB. В подклассе дочерний метод сначала проверяет контейнер для любых кеш-кешированных (облачных) объектов 10, прежде чем он вызовет родительский метод, и создаст новый экземпляр . Обратите внимание, что с весны 3.2 больше не нужно добавить CGLIB в ваш путь к классу, потому что классы CGLIB были переупакованы под номером org.springframework и включены непосредственно в пружинный сердечник JAR.

+0

Не могли бы вы указать мне куда-нибудь, где это задокументировано? – nikhil

+0

@nikhil Добавлена ​​ссылка источника Docs. –

+0

Спасибо, я не думаю, что я смог бы найти эту часть документации самостоятельно. – nikhil

Смежные вопросы