Spring Controller'da başlatma yöntemi (açıklama sürümü)


105

Bir denetleyiciyi daha yeni ek açıklama sürümüne dönüştürüyorum. Eski sürümde, springmvc-servlet.xml'de init yöntemini şunu kullanarak belirtiyordum:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Ek açıklama sürümünü kullanarak init yöntemini nasıl belirtebilirim?


Yanıtlar:


238

Kullanabilirsiniz

@PostConstruct
public void init() {
   // ...
}

1
Haklısınız, "Common Annotations 1.0", Java1.7 de çalışacak.
Acımasız

Kullanıcıyı SecurityContextHolder'dan kullanmanız gerekiyorsa, PostConstruct anında başlatılmamıştır. Vatansız bir yöntem gibi kullanılması gerekiyor. (getUser () ... {return Security ... user ();}
Joao Polo

genel veya özel
anshulkatta

20

Alternatif olarak, web sınıf uygulamak olabilir InitializingBeanbir geri arama fonksiyonunu (sağlamaktır arayüzü afterPropertiesSet()fasulye inşa edildiğinde ApplicationContext çağıracağı).


4

İlkbaharda başlatma sürecini engellemenin birkaç yolu vardır. Tüm fasulyeleri ve otomatik kablolamayı başlatmanız gerekiyorsa, bunu sağlayacağını bildiğim en az iki yol var. Sadece ikincisini test ettim ama ikisinin de aynı şekilde çalıştığına inanıyorum.

@Bean kullanıyorsanız, bunun gibi initMethod'a başvurabilirsiniz.

@Configuration
public class BeanConfiguration {

  @Bean(initMethod="init")
  public BeanA beanA() {
    return new BeanA();
  }
}

public class BeanA {

  // method to be initialized after context is ready
  public void init() {
  }

} 

@Component kullanıyorsanız, @EventListener ile bu şekilde açıklama ekleyebilirsiniz.

@Component
public class BeanB {

  @EventListener
  public void onApplicationEvent(ContextRefreshedEvent event) {
  }
}

Benim durumumda, Spring Boot'un seçilen çerçeve olduğu IoC / DI'yi kullandığım eski bir sistemim var. Eski sistem, tabloya birçok döngüsel bağımlılık getiriyor ve bu nedenle ayarlayıcı bağımlılığını çok kullanmalıyım. Ayarlayıcı tarafından otomatik kablolama / enjeksiyon henüz yapılmadığı için @ PostConstruct'a güvenemediğim için bu bana biraz baş ağrısı verdi. Sıra yapıcı, @PostConstruct ve ardından otomatik kablolu ayarlayıcılardır. Bunu tüm fasulyeler için en son ve "aynı" zamanda çalışacak @EventListener ek açıklaması ile çözdüm. Örnek InitializingBean aswell'in uygulanmasını gösterir.

Birbirine bağımlı iki sınıfım (@Component) var. Bu örnekte sınıflar aynı görünmektedir ve bunlardan yalnızca birini göstermektedir.

@Component
public class BeanA implements InitializingBean {
  private BeanB beanB;

  public BeanA() {
    log.debug("Created...");
  }

  @PostConstruct
  private void postConstruct() {
    log.debug("@PostConstruct");
  }

  @Autowired
  public void setBeanB(BeanB beanB) {
    log.debug("@Autowired beanB");
    this.beanB = beanB;
  }

  @Override
  public void afterPropertiesSet() throws Exception {
    log.debug("afterPropertiesSet()");
  }

  @EventListener
  public void onApplicationEvent(ContextRefreshedEvent event) {
    log.debug("@EventListener");
  } 
}

Bu, kapsayıcı başladığında çağrıların sırasını gösteren günlük çıktısıdır.

2018-11-30 18:29:30.504 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : Created...
2018-11-30 18:29:30.509 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : Created...
2018-11-30 18:29:30.517 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @Autowired beanA
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : afterPropertiesSet()
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @Autowired beanB
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : afterPropertiesSet()
2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @EventListener
2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @EventListener

Gördüğünüz gibi @EventListener, her şey hazır ve yapılandırıldıktan sonra en son çalıştırılır.


-2
public class InitHelloWorld implements BeanPostProcessor {

   public Object postProcessBeforeInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("BeforeInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

   public Object postProcessAfterInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("AfterInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.