23 Kasım 2018 Cuma

SpringContext @Lazy Anotasyonu

Giriş
Şu satırı dahil ederiz
import org.springframework.context.annotation.Lazy;
1. Bu anotasyonu kullanmadan önce her şeyi lazy yapmak istersek şöyle yaparız
// In application.properties file
spring.main.lazy-initialization=true

// In application.yml file
spring:
  main:
    lazy-initialization: true
veya lazyInitialization() metodu kullanılır. Şöyle yaparız
@SpringBootApplication public class LazyApplication { public static void main(String[] args) { new SpringApplicationBuilder(LazyApplication.class) .lazyInitialization(true) .build() .run(args); } }

2. Sadece A ve B arasında lazy ilişki kurmak istersek @Lazy kullanılabilir.

- @Lazy anotasyonu A sınıfında Constructor Injection, Setter Injection ve Field Injection ile kullanılabilir. Ayrıca @Configuration ile de kullanılabilir.
- Eğer B sınıfının da yaratılmasını istemiyorsak yani her iki tarafında da sonradan yaratılmasını istiyorsak, B sınıfı da @Lazy olarak işaretlenmelidir. Yani bu anotasyon hem A da hem de B de kullanılmalıdır.

Açıklaması şöyle.
By default, the Spring IoC container creates and initializes all singleton beans at the time of application startup. We can prevent this pre-initialization of a singleton bean by using the @Lazy annotation.

The  @Lazy annotation may be used on any class, directly or indirectly annotated with the  @Component or on methods annotated with the @Bean.
Her kullanımda Spring A sınıfında kullanılmak üzere bir proxy üretir. Açıklaması şöyle.
Spring uses a proxy instead of the real object at the injection point. This proxy delays the initialization of the underlying object until it is first used.
Constructor Injection İle Kullanımı
Bu kullanımla ilgili Circular Dependency yazısına bakılabilir.

Örnek ver

Field Injection İle Kullanımı
Açıklaması şöyle.
Lazy annotation may also be placed on injection points marked with Autowired or Inject: In that context, it leads to the creation of a lazy-resolution proxy for all affected dependencies, as an alternative to using ObjectFactory or Provider.
Şöyle yaparız.
@Autowired
@Lazy
private EventPublishService eventPublishService;
Setter Injection İle Kullanımı
Örnek ver

Configuration İle Kullanımı
Açıklaması şöyle. B sınıfında kullanılır.
If Lazy is present on a @Configuration class, this indicates that all @Bean methods within that @Configuration should be lazily initialized.
Örnek
Şöyle yaparız.
@Lazy
@Configuration
@ComponentScan(...) // will be lazily initialized with config
public class LazyConfiguration {

  @Bean
  public SomeBean beanName() { // will be lazily initialized with config
    return new SomeBean();
  } 

  @Bean
  public OtherBean beanName() { // will be lazily initialized with config
    return new OtherBean();
  }     
}
Örnek
Şöyle yaparız
@Lazy
@Bean
public PasswordEncoder encoder() {
  return new BCryptPasswordEncoder();
}
Örnek
Şöyle yaparız
@SpringBootApplication
public class LazyApplication {

  @Bean("eagerBean")
  public void eagerBean() {
    System.out.println("Eager Bean is Created !!");
  }


  @Lazy
  @Bean("lazyBean")
  public void lazyBean() {
    System.out.println("Lazy Bean is Created !!");
  }
}


Hiç yorum yok:

Yorum Gönder