27 Mayıs 2019 Pazartesi

SpringBoot DataSource application.properties Ayarları

Giriş
DataSource nesnesi yaratmak için 2 tane yöntem var.
1. Kod içinde ismi dataSource olan bir bean yaratmak
2. application.properties dosyasına spring.datasource ile başlayan ayarları girmek ve Spring'in bir DataSource bean'i yaratmasını sağlamak.

Bu yazıda ikinci yöntem anlatılıyor. Eğer birinci yöntem kullanılırsa Spring auto configuration yapmaz. Açıklaması şöyle
If you define your own DataSource bean, auto-configuration does not occur.
Güvenlik
application.properties dosyasına şifre ve diğer önemli şeyleri yazmak istemiyorsak Spring'e parametre olarak geçmek mümkün

1. JVM Parametreleri
Örnek
Şöyle yaparız.
java -jar your-spring-boot-app.jar
 -Dspring.datasource.url=jdbc:postgresql://localhost/database ...
2. Ortam Değişkeni
Örnek
Şöyle yaparız.
export SPRING_DATASOURCE_URL="jdbc:postgresql://localhost/database"
3. spring.datasource Alanları
Veri tabanı bağlantısı içindir. Bu başlık altında
url,username,password,driver-class-name,testWhileIdle,validationQuery
gibi değerler doldurulur.

continue-on-error Alanı
Açıklaması şöyle
By default, Spring Boot enables the fail-fast feature of the Spring JDBC initializer. This means that, if the scripts cause exceptions, the application fails to start. You can tune that behavior by setting spring.datasource.continue-on-error.
Örnek
Şöyle yaparız.
spring.datasource.continue-on-error=true
initialization-mode Alanı
Şöyle yaparız.
spring.datasource.url= jdbc:postgresql://localhost:5432/Crypto
spring.datasource.username=postgres
spring.datasource.password=wololo
spring.datasource.initialization-mode=always
ConnectionPool Değerleri
Hikari kullanıyorsak Hikari Ayarları yazısına taşıdım.

driver -class-name Alanı
Bu alan tamamen veri tabanına mahsus. Şu değerleri alabilir
- org.h2.Driver
- com.mysql.jdbc.Driver
- oracle.jdbc.driver.OracleDriver
- org.postgresql.Driver

h2
H2 Ayarları yazısına taşıdım.

Mysql
Mysql Ayarları yazısına taşıdım.

Oracle
Oracle Ayarları yazısına taşıdım.

PostgreSQL
PostgreSQL Ayarları yazısına taşıdım.

Tomcat
Tomcat Ayarları yazısına taşıdım.

passwordAlanı
Şifreyi açıktan yazmak istemiyorsak Jasypt (Java Simplified Encryption)  kullanılabilir

testWhileIdle Alanı
Örnek
Şöyle yaparız
# ==============================================================
# = Keep the connection alive if idle for a long time (needed in production)
# ==============================================================
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

SpringData SimpleJpaRepository Sınıfı

save metodu
Metodun içi şöyle.
@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {

  List<S> result = new ArrayList<S>();

  if (entities == null) {
    return result;
  }

  for (S entity : entities) {
    result.add(save(entity));
  }

  return result;
}

SpringData CrudRepository Arayüzü

Giriş
Şu satırı dahil ederiz.
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
Kalıtım
Şeklen şöyle


Bu sınıftan kalıtan JpaRepository arayüzü var. JpaRepository ile findAll(Pageable), findAll(Sort) flush(), saveAndFlush(S) gibi kullanışlı metodlar geliyor

JpaRespository arayüzünü gerçekleştiren sınıf ise SimpleJpaRepository Sınıfı
Bu sınıf altta EntityManager nesnesini kullanır.  Dolayısıyla " JPA Entity Lifecycle" geçerlidir.

Ortak Bir Atadan Kalıtım
Ortak bir atadan kalıtım için @NoRepositoryBean Anotasyonu yazısına bakınız.

Transaction
Bu sınıf otomatik olarak transaction başlatır. Açıklaması şöyle.
CRUD methods on repository instances are transactional by default. For reading operations the transaction configuration readOnly flag is set to true, all others are configured with a plain @Transactional so that default transaction configuration applies.
Tanımlama
Örnek
Şöyle yaparız
@Repository
public interface MyDataRepository extends CrudRepository<Tour, Long> {
  List<MyData> findAll();

  // More functions
}
Metodlar şöyle
long count();
void delete(T entity);
void deleteAll();
void deleteAll(Iterable<? extends T> entities);
void deleteAllById(Iterable<? extends ID> ids);
void deleteById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
Optional<T> findById(ID id);
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
save metodu
Örnek ver

saveAll metodu
İmzası şöyle.
@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities)
Diğer
Repository içine yazdığımız metodlara @Query Anotasyonu ile sql tanımlanabilir. 

22 Mayıs 2019 Çarşamba

SpringCache GuavaCache Sınıfı - Kullanmayın

Giriş
Bu sınıfı kullanmamak lazım. Açıklaması şöyle.
Spring project decided to endorse a switch to Caffeine cache.

Caffeine supersedes the caching support in the Google Guava library with an actively maintained Java 8+ version in standalone form.
constructor - String + Cache
Cache arayüzününden kalıtan nesneyi yaratmak için CacheBuilder kullanılır.
Örnek
Şöyle yaparız.
public final static String PRODUCTS_CACHE = "products";

@Bean
public Cache productsCache() {
  return new GuavaCache(PRODUCTS_CACHE, CacheBuilder.newBuilder()
              .expireAfterWrite(60, TimeUnit.SECONDS)
              .build());
}
Örnek
Şöyle yaparız.
@Bean
public CacheManager cacheManager() {
  SimpleCacheManager cacheManager = new SimpleCacheManager();
  GuavaCache guavaCache1 = new GuavaCache("myCaching", CacheBuilder.newBuilder()
    .maximumSize(100).expireAfterWrite(1, TimeUnit.DAYS).build());
  cacheManager.setCaches(Arrays.asList(guavaCache1));
  return cacheManager;
}
getNativeCache metodu
Şöyle yaparız.
GuavaCache userSettingCache = ...;
Cache<K,V> nativeCache = userSettingCache.getNativeCache();

21 Mayıs 2019 Salı

SpringCloud Config Server @EnableConfigServer

Giriş
Şu satırı dahil ederiz
import org.springframework.cloud.config.server.EnableConfigServer;
Açıklaması şöyle
@EnableConfigServer is class-level annotation. It helps Spring Cloud Config Server to be embedded in Spring Boot application very easily and the @EnableConfigServer annotation makes the Spring Boot application act as a Configuration Server.
Konfigürasyon verisinin Repository 'den çekilerek kullanılmasını sağlar. Repository olarak Git, SVN, Dosya Sistemi kullanılabilir

Ayarları okuyan taraf için SpringCloud Config Client yazısına bakınız.

Örnek - git
Örneği buradan aldım
1. Bir tane dizin yarat, örneğin ismi  "config-properties" olsun
2. Bu dizinde bir tane properties dosyası yarat, örneğin ismi "hello-service.properties" olsun. Her dosya bir servise ait. Burada servisin ismi "hello-service". Dosyanın içi şöyle olsun
message=Hello world - this message is from config server
3. application.properties dosyasında git ile saklanan repository yolunu belirtmek gerekir. 

4. Konfigürasyon Sunucusu Uygulaması
@EnableConfigServer anotasyonu "spring.cloud.config.server.git.uri" ile belirtilen yoldaki her properties dosyası için bir tane Rest Endpoint oluşturur. 

Örnek
Şöyle yaparız
@EnableConfigServer
@SpringBootApplication
public class HelloConfigServerApplication {
  public static void main(String[] args) {
    SpringApplication.run(HelloConfigServerApplication.class, args);
  }
}
Sunucu çalıştıktan sonra hello-service.properties dosyasına erişmek için şöyle yaparız. Burada default kelimesi hello-service.properties anlamına geliyor.
http://localhost:8888/hello-service/default
Çıktı olarak şunu alırız
{
  "name": "hello-service",
  "profiles": [
    "default"
  ],
  "label": null,
  "version": "3da88aa3c6103cc7f2b383a3ee5d5dad5e6e870c",
  "state": null,
  "propertySources": [
    {
      "name": "file:///d:/config-properties/hello-service.properties",
      "source": {
        "message": "Hello world - this message is from config server"
      }
    }
  ]
}
Eğer bu servise ait hello-service-development.properties dosyasına erişmek istersek şöyle yaparız
http://localhost:8888/hello-service/development