2012-03-18 22 views
8

Próbuję zrozumieć BeanPostProcessor na wiosnę i nie rozumiem, co robi. Czy jest prawdą, że BeanPostProcessor definiuje dwie metody, która jest wywoływana w tych punktach:BeanPostProcessor zamieszanie

  • Przed inicjalizacją (zarówno metody init lub afterPropertiesSet), ale instancja jest tworzona.
  • Po metody init, lub metody afterPropertiesSet nazywa

Czy to prawda? Biorąc pod uwagę przykład i tekst na stronie 118 i dalej jest mylący. Nie sądzę, abym mógł skopiować więcej tekstu z tekstu, ale adnotacje i to, co się tam dzieje, jest trudne do zrozumienia.

Czy masz zaimplementować ten interfejs na ziarnach, które chcesz, czy też powinieneś użyć tego na fasoli, która jest ogólna dla wielu ziaren? Widzę, że masz zarówno i przedmiot i ciąg argument przekazany w.

Czasami może znaleźć się w sytuacji, w której trzeba performsome dodatkowej obróbki bezpośrednio przed i po Wiosna instancję Bean. Przetwarzanie może być tak proste, jak modyfikowanie fasoli, lub tak złożone, jak zwracanie zupełnie innego obiektu! Interfejs BeanPostProcessor dwie metody: postProcessBeforeInitialization, które nazywa się do wiosny wywołuje jakichkolwiek haków inicjujące (takie jak fasola InitializingBean.afterPropertiesSet lub startowe metoda) i postProcessAfterInitialization, która wywołuje tłoka po inicjalizacji haki uda.

Wiosna Pro 2.5, strona 118

Odpowiedz

18

Wiosna daje wiele postprocesorów, nie tylko BeanPostProcessor. Ponadto większość z nich jest wykorzystywana przez samą Wiosnę. Ten, o którym wspomniałeś w tym pytaniu, jest używany (jak podaje jego nazwa) do publikowania komponentu bean procesu po jego utworzeniu.Zachowanie sprężyna pojemnik jest następujący:

  • sprężyna wystąpienie fasoli wywołanie konstruktor
  • postProcessBeforeInitialization(Object bean, String beanName) nazywa
  • fasoli proces inicjalizacji: @PostConstruct, afterPropertiesSet() (zdefiniowany przez interfejs InitializingBean zwrotnego) zwyczaj skonfigurowana init metody
  • to nazywane

Na pierwszy rzut oka może to wyglądać skomplikowanie i przytłaczająco, ale kiedy budujesz złożone aplikacje na szczycie wiosny, wszystkie te funkcje są nieocenione.

Możliwe scenariusze są na przykład (podjęte od samego wiosna):

  • AutowiredAnnotationBeanPostProcessor - skanuje fasoli szuka @Autowire adnotacją w celu wykonania iniekcji zależność
  • RequiredAnnotationBeanPostProcessor - sprawdza, czy wszystkie zależności oznaczone jako @Required został wstrzyknięty.
  • ServletContextAwareProcessor - wstrzykuje ServletContext ziaren realizacji ServletContextAware interfejs
  • właściwie inicjalizacji/callbacks desctruction takich jak JSR-250 @PostConstruct i @PreDestroy są realizowane przy użyciu procesora postu: CommonAnnotationBeanPostProcessor

Oczywiście wszystkie wymienione procesory pocztowe muszą być wykonane w określonej kolejności, ale to jest odpowiedzialność Wiosny, aby to zapewnić.

6

zaimplementować BeanPostProcessor zbudować serwis, który ma zastosowanie do wszystkich ziaren w kontekście, ponieważ są one tworzone. Dokumentacja JavaDocs pokazuje wiele konkretnych przykładów, ale jedną z nich konsekwentnie używam jest AutowiredAnnotationBeanPostProcessor. Używa refleksji do skanowania klasy ziarnistości dla adnotacji @Autowired na polach i metodach.

public class MyBean { 
    @Autowired MyOtherBean otherBean; // assigned by AutowiredAnnotationBPP 
    ... 
} 

Usługa ta jest najbardziej przydatna przy budowaniu własnego ramy na szczycie wiosną lub funkcji, które obowiązują w całej podgrupie wielu ziaren. Bardziej prawdopodobne jest, że użyjesz istniejących procesorów bean, które zapewnia Spring.

+0

To jest lepsza odpowiedź niż zaakceptowana odpowiedź. –