-
@Configuration를 이용하여 Bean생성하기Study/Spring 2019. 7. 15. 23:10
맴버변수를 변경하여 동일한 Bean을 다양하게 생성할때
@Getter @Setter @Builder public class SequenceGenerator { private String prefix; private String suffix; private final AtomicInteger counter = new AtomicInteger(); public String getSequence() { return new StringBuilder() .append(prefix) .append(counter.getAndIncrement()) .append(suffix) .toString(); } }
SequenceGenerator
는 순차적으로 증가하는 고유번호를 생성하여 주는 클래스이다. 이 클래스는 @Service나 @Component로 등록하지 않고 필요에 따라서prefix
와suffix
를 다르게 지정하여 사용하고 싶다. 그리고singleton
이여야 하며, 다른 Spring bean에서 DI로 주입받아 사용하고 싶다.@Configuration public class SequenceGeneratorConfiguration { @Bean public SequenceGenerator uuIdsequenceGenerator() { return SequenceGenerator.builder() .prefix("UUID_") .suffix("_OX") .build(); } @Bean public SequenceGenerator txIdsequenceGenerator() { return SequenceGenerator.builder() .prefix("TXID_") .suffix("_OX") .build(); } }
@Configuration
을 통해서@Bean
을 위와같이 직접 생성하여 리턴하는 경우 Spring Application Context에서 Bean을 관리하여 준다. 필요에 따라서 prefix를 UUID와 TXID로 된 2개의 SequenceGenerator가 Spring Bean으로 등록되었다. 이제 다른 곳에서는 해당 Bean을 주입받아서 자유롭게 사용하면 된다.
Datasource bean처럼 Spring설정에 의해서 미리 약속된 설정을 세팅할때
@Configuration public class DataSourceConfiguration { @Bean public DataSource dataSource(Environment environment) { SimpleDriverDataSource dataSource = new SimpleDriverDataSource(); dataSource.setDriverClass("DRIVER"); dataSource.setUrl("URL"); dataSource.setUsername("USERNAME"); dataSource.setPassword("PASSWORD"); return dataSource; } @Bean public DataSourceTransactionManager transactionManager() { DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource()); return dataSourceTransactionManager; } }
기존에 XML설정 대신에 간단하게 Datasource를 정의하거나 transactionManager를 정의하는 경우도 위와 같이 @Configuration을 사용할 수 있다. 이런일이 가능한 이유는 대부분의 Spring 혹은 SpringBoot의 설정은
@ConditionalOnMissingBean({DataSource.class})
이나@ConditionalOnMissingBean({PlatformTransactionManager.class})
을 이용하여 사용자가 해당 Bean을 직접 구현하는 경우 자동으로 세팅되도록 구현되어져 있다.@Configuration @ConditionalOnClass({JdbcTemplate.class, PlatformTransactionManager.class}) @AutoConfigureOrder(2147483647) @EnableConfigurationProperties({DataSourceProperties.class}) public class DataSourceTransactionManagerAutoConfiguration { public DataSourceTransactionManagerAutoConfiguration() { } @Configuration @ConditionalOnSingleCandidate(DataSource.class) static class DataSourceTransactionManagerConfiguration { private final DataSource dataSource; private final TransactionManagerCustomizers transactionManagerCustomizers; DataSourceTransactionManagerConfiguration(DataSource dataSource, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) { this.dataSource = dataSource; this.transactionManagerCustomizers = (TransactionManagerCustomizers)transactionManagerCustomizers.getIfAvailable(); } @Bean @ConditionalOnMissingBean({PlatformTransactionManager.class}) public DataSourceTransactionManager transactionManager(DataSourceProperties properties) { DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource); if (this.transactionManagerCustomizers != null) { this.transactionManagerCustomizers.customize(transactionManager); } return transactionManager; } } }
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
을 보면,@ConditionalOnMissingBean({PlatformTransactionManager.class})
을 통해서 자동으로 설정을 구성하는 것을 볼 수 있다.'Study > Spring' 카테고리의 다른 글
Spring DI의 모든 방법 @Autowired / 생성자 주입 (1) 2019.07.17