27 Haziran 2019 Perşembe

SpringBoot @EnableAutoConfiguration Anotasyonu

Giriş
Şu satırı dahil ederiz.
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 - Bu anotasyon @SpringBootApplication tarafından otomatik olarak getirilir.
- @EnableAutoConfiguration ve @SpringBootApplication birlikte kullanılmamalıdır! Ya birisi ya da öbürü kullanılır. 

Bu Anotasyon Neleri AutoConfigure Edeceğini Nereden Biliyor?
Açıklaması şöyle.
On starting our application, Spring Boot checks for a specific file spring.factories in the META-INF directory of spring’s spring-boot-autoconfigure project. 
Dosya spring-boot-autoconfigure-2.1.3.RELEASE.jar içinde. Bu dosyadaki org.springframework.boot.autoconfigure.EnableAutoConfiguration alanında tüm sınıflar listelenmiş durumda ve liste çok uzun

Bu listedeki her sınıfta  @ConditionalOnClass anotasyonu var. Böylece bu sınıf belli koşullar yerine gelmişse AutoConfig işlemini yapıyor.

Kendi AutoConfiguration Sınıfımız
Kendi sınıfımız yazmak ta mümkün. Tek yapmamız gerek bir proje oluşturmak ve src/main/resources/META-INF/spring.factories dosyasına kendi sınıfımızın full path'ini belirterek eklemek. 
Örnek
Şöyle yaparız
# Auto configure classes.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.vishnu.boot.logging.autoconfigure.MethodExecutionTimeAutoConfiguration

exclude Alanı
Belli bir auto configuration özelliğini devre dışı bırakmak içindir. Aslında exclude işlemi için bu anotasyonu kullanmaya gerek yok. Bunun için iki yöntem var

1. application.properties kullanılabilir
Örnek
Şöyle yaparız
spring.autoconfigure.exclude=
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

2. @SpringBootApplication(exclude={...}) kullanılabilir
Örnek
Şöyle yaparız
@SpringBootApplication(exclude={GsonAutoConfiguration.class,JmxAutoConfiguratio.class}
scanBasePackages = {...}
)
Kullanım
Ancak illaki bu anotasyonu kendimiz kullanmak istersek şöyle yaparız

Örnek
Şöyle yaparız.
@EnableAutoConfiguration(exclude = { JndiConnectionFactoryAutoConfiguration.class,
 DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
 JpaRepositoriesAutoConfiguration.class,
 DataSourceTransactionManagerAutoConfiguration.class })
Örnek
Şöyle yaparız.
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
  DataSourceTransactionManagerAutoConfiguration.class,
  HibernateJpaAutoConfiguration.class})

SpringBoot Embedded Tomcat

Embedded Tomcat Yerine Başka Bir Sunucu Kullanmak
Açıklaması şöyle.
You can use spring-boot-starter-jetty  or spring-boot-starter-undertow as a dependency for each project as you need.
Tomcat'i dışarıda bırakmak için şöyle yaparız
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      </exclusion>
    </exclusions>
</dependency>
Daha sonra undertow'u eklemek için şöyle yaparız
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

26 Haziran 2019 Çarşamba

SpringSecurity DaoAuthenticationProvider Sınıfı - Default AuthenticationProvider Sınıfı Budur

Giriş
 Kendi İçindeki UserDetailsService Nesnesiyle Kullanıcıyı Doğrular. 
Bu sınıfın kalıtım hiyerarşisi şöyle
DaoAuthenticationProvider -> AbstractUserDetailsAuthenticationProvider ->
AuthenticationProvider
Sınıfın içinde
UserDetailsService userDetailsService;
şeklinde bir alan var. 

Tabi 
UserDetailsManager -> UserDetailsService
kalıtımı olduğu için bu alana JdbcUserDetailsManager da atanabiliyor.

Neticede bu sınıfın amacı kullanıcıyı doğrulamak. Kullanıcı bilgilerini yüklemek için de UserDetailsService alanını kullanıyor.

setPasswordEncoder metodu
Şöyle yaparız
public class WebSecurityConfig {

  private final BCryptPasswordEncoder passwordEncoder;

  @Bean
  public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
     ...
    }

  @Bean
  public DaoAuthenticationProvider authProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(inMemoryUserDetailsManager());
    authProvider.setPasswordEncoder(passwordEncoder);
    return authProvider;
  }
  ...
}
setUserDetailsService metodu
Şöyle yaparız.
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

  @Bean
  public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
    authenticationProvider.setUserDetailsService(userService);
    authenticationProvider.setPasswordEncoder(passwordEncoder());
    return authenticationProvider;
  }
  ...
}

25 Haziran 2019 Salı

SpringOXM - Nesneyi XML'e Çevirir

Giriş
SpringOXM projesi verilen nesneyi XML'e çevirir ve XML'den nesneye çevirir. Aslında aynı bir ORM gibi düşünülebilir.

Maven
Şu satırı dahil ederiz.
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-oxm</artifactId>
  <version>4.3.7.RELEASE</version>
  <scope>compile</scope>
</dependency>
Kullanılan Kütüphaneler
Marshall ve Unmarshall işlemi için şu kütüphaneler kullanılabilir.
- JAXB : İki tane sınıf sunar Jaxb1Marshaller, Jaxb2Marshaller
- Castor
- XMLBeans
- JiBX
- XStream

17 Haziran 2019 Pazartesi

SpringBoot application.properties Ayarları

Giriş
Açıklaması şöyle.
SpringApplication loads properties from application.properties files in the following locations and adds them to the Spring Environment:

- A /config subdirectory of the current directory
- The current directory
- A classpath /config package
- The classpath root
Test Ortamı
Açıklaması şöyle.
We might also have a requirement to use different property values when our application is under test.

Spring Boot handles this for us by looking in our “src/test/resources” directory during a test run. Again, default properties will still be injectable as normal but will be overridden these ones if there is a collision.
spring.config.import Ayarı
Örnek
elimizde env.properties dosyası olsun. Bu dosyayı .gitignore yaparsak git'e gönderilmez.
DB_DATABASE=NameofyourappSavedIntoYourDB
DB_USER=yourUsername
DB_PASSWORD=SuperStrongPassword
API_KEY=superkey
Şöyle yaparız
spring.config.import=file:env.propertiesalo
spring.datasource.username=${DB_USER} spring.datasource.password=${DB_PASSWORD}
--spring.config.name Ayarı
application.properties dosyasını yerine başka bir isim kullanabilmemizi sağlar.

Örnek
Şöyle yaparız.
java -jar myproject.jar --spring.config.name=myproject
--spring.config.location Ayarı
Açıklaması şöyle. -Dspring.config.location seçeneği veya --spring.config.location seçeneği ile dosya yolu belirtilir.
If you do not like application.properties as the configuration file name, you can switch to another file name by specifying a spring.config.name environment property. You can also refer to an explicit location by using the spring.config.location environment property (which is a comma-separated list of directory locations or file paths).
Örnek
Şöyle yaparız
java -jar -Dspring.config.location=file:\\\C:/application-myconfig.yml aplication1.jar
Örnek
Şöyle yaparız.
java -jar app.jar --spring.config.location=file:<property_file_location>
Örnek
Şöyle yaparız.
java -jar myproject.jar --spring.config.location=classpath:/default.properties
Örnek
Kodun içinden şöyle yaparız.
@SpringBootApplication
public class SimpleBoot {

  public static void main(String[] args) {
    System.setProperty("spring.config.location","file:/path/to/application.yml")
    SpringApplication.run(SimpleBoot.class, args);
  }
}
Örnek
Kodun içinden şöyle yaparız.
static void main(String[] args) {
  SpringApplication.run(MyApplication,
    ["--spring.config.location=file:${System.getProperty('user.home')}/application.yml"] 
    + args)
}