ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @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로 등록하지 않고 필요에 따라서 prefixsuffix를 다르게 지정하여 사용하고 싶다. 그리고 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

    댓글

Designed by Tistory.