Spring Boot Profiles
Uygulamalar, farklı ortamlarda farklı konfigürasyonlara sahip olmaktadırlar. Spring Profile ise bu ortamlardaki konfigürasyonlarınızı yönetmenizi sağlar.
Uygulamaların canlıya geçiş aşamaları farklılık gösterse de temel olarak test ve prod ortamları olmazsa olmaz iki ortamdır. Dolayısıyla bu ortamların database bağlantısı, bağlandığı servislerin adresleri, uygulamanın ayağa kalkacağı port, security ve ya cache mekanizmaları ortamlar arasında farklılık gösterebilir. Dolayısıyla bu konfigürasyonları ortama göre değiştirmemiz ve o ortam konfigürasyonuna uygun şekilde uygulamayı ayağa kaldırmamız gerekir.
Şimdi Dev ve Prod ortamları için biz deneme yapalım.
-
@Profile Annatation
Spring 3.1 versiyonundan itibaren bu Annatation desteklemektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Configuration @Profile("test") public class DevProfileConfig { public DataSource dataSource(){ return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("classpath:schema.sql") .addScript("classpath:test-data.sql") .build(); } } |
Spring 3.2 ile beraber @Profile metod seviyesinde de kullanılmaya başlanmıştır. Bu sayede tek class içinde @Profile ve @Bean tanımlarını aşağıdaki gibi kullanabilir hale gelmiş olduk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@Configuration public class DataSourceConfig { @Bean(destrolMethod="shutdown") @Profile("test") public DataSource dataSource(){ return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("classpath:schema.sql") .addScript("classpath:test-data.sql") .build(); } @Bean @Profile("prod") public DataSource jndiDataSource(){ JndiObjectFactoryBean jndiObject= new JndiObjectFactoryBean(); jndiObject.setJndiName("jdbc/myDS"); jndiObject.setResourceRef(true); jndiObject.setProxyInterface(javax.sql.DataSource.class); return (DataSource)jndiObject.getObject(); } } |
Tabii ki Bean tanımlarını xml dosyalarınında da yapabiliriz.
1 2 3 4 5 6 7 8 |
<beans profile="test"> <bean id="devDatasourceConfig" class="bilisimio.profiles.TestDatasourceConfig" /> </beans> |
Web projesinde aşağıdaki gibi default profile tanımını yapabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<web-app> <context-param> <param-name>spring.profiles.default</param-name> <param-value>test</param-value> </context-param> <servlet> ... </servlet> <servlet-mapping> .... </servlet-mapping> </web-app> |
Integration testleri için Spring @ActiveProfiles annotation sunuyor.
1 2 3 4 5 6 7 8 9 10 |
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes ={PersistenceTestConfig.class}) @ActiveProfiles("dev") public class PersistenceTest{ ... } |
2. Configuration Files
Konfigürasyonları application.properties / yml dosyalarıyla da yönetebiliriz.
- application-dev.yml
- application-test.yml
- application-prod.yml
Uygulamanın hangi profile ile çalışması gerektiğini ise aşağıdaki gibi konfigüre edebilirsiniz.
Run as -> Run Configurations -> Environment -> Add
spring.profiles.active : test
ya da
1 2 3 4 5 |
java -jar bilisimio.jar --spring.profiles.active=test |
Uygulamayı çalıştırdığımızda log’larda aşağıdaki çıktıyı göreceğiz.
1 2 3 4 5 |
The following profiles are active: test |
Kaynak;
- Spring In Action 4. Edition
- https://www.baeldung.com/spring-profiles
Faydalı olması dileğiyle.