2010-02-09 39 views

Odpowiedz

11

The dynamic proxy jest funkcją JDK. Można go użyć do implementacji interfejsu przy użyciu an invocation handler.

klasy dynamicznej proxy (w skrócie określane jako klasa Pełnomocnik poniżej) to klasa który implementuje listę interfejsów określonych w czasie działania, gdy klasa utworzony z zachowaniem jak opisano poniżej. Interfejs proxy to taki interfejs , który jest implementowany przez klasę proxy . Instancja serwera proxy to instancja klasy proxy. Każda instancja serwera proxy ma powiązany obiekt wywołania , który implementuje interfejs InvocationHandler interfejsu .

Dynamiczny proxy ma trochę narzut. W większości przypadków obciążenie nie będzie jednak znaczące. Prawdziwy problem polega na tym, że (nadmierne) użycie dynamicznych serwerów proxy sprawia, że ​​aplikacja jest trudniejsza do zrozumienia i debugowania. Na przykład dynamiczny serwer proxy pojawi się z liniami mulitple w stosie stacktrace.

Dynamiczne proxy są często używane do implementacji decorators. Jednym z przykładów tego jest AOP na wiosnę. (Nie chcę zagłębiać się w szczegóły AOP i nie będę używał terminologii AOP, aby wszystko było proste). Gdzie pewne obawy są wdrażane w jednej klasie i używane w wielu miejscach. Dynamiczne serwery proxy (i procedury obsługi wywołań) są tylko kodem kleju (dostarczonym przez Spring) w celu przechwycenia wywołań metod. (W rzeczywistości dynamiczne proxy są tylko szczegółami implementacji tej możliwości, a generowanie klas w locie jest kolejną możliwością implementacji.)

+0

Dlaczego to wdrażamy? Chcę zapytać o metodologię lub te same rzeczy. – Linh

37

Serwery proxy są używane przez AOP. W skrócie:

Zwykle masz.

Caller --> Real object 

Ale gdy, na przykład, chcesz automatyczne zarządzanie transakcji, wiosna stawia pełnomocnictwa swojego rzeczywistego obiektu

Caller --> Proxy --> Real object 

gdzie proxy rozpoczyna transakcję.

Here is nice article wyjaśniając zarówno istotę prokurentów i ich efektywności (wydajności) na wiosnę

+5

Bozho, to bardzo miłe wyjaśnienie. – lwpro2

+0

następne pytanie - dlaczego wiosną trzeba użyć aop? Wiem tylko adnotację @Transaction – gstackoverflow

+0

Wiele innych rzeczy. Buforowanie, na przykład. Wycięcie lasu. Ścieżka audytu. Lub cokolwiek innego możesz się rozwijać – Bozho

0

Możemy dodać funkcjonalność klasy Javy poprzez modyfikację źródłowego/kod bajtowy lub przy użyciu podklasy lub pełnomocnika, który osadza się dodatkowe funkcje i deleguje wywołania do ukrytego obiektu.

0

AOP może również używać serwerów proxy CGLIB. Służy do proxy klas zamiast interfejsów.

0

Inne odpowiedzi są dobre, ale oto, jak myślę o tym w bardzo prosty sposób.

  1. Adnotacja oznacza "dodaj ukryty kod, aby uzyskać dodatkowe zachowanie."
  2. Ramy (lub cokolwiek wie, co oznacza adnotacja) dodaje kod bajtowy, Spring w czasie wykonywania, AspectJ w czasie kompilacji, na przykład.
  3. Dodaje kod jako serwer proxy wraz z przechwytywaczem. (Opakowanie, dekorator, adapter są podobne i mogą być łatwiejsze do zrozumienia niż "proxy").
  4. Po uruchomieniu programu przechwytujący wysyła żądanie do serwera proxy, który wykonuje swoje zadanie, które następnie może lub nie może wysłać wykonania do klasa, którą zakodowałeś i która "owija".