2016-10-13 8 views
0

Какие возможности у меня есть, чтобы добавить функциональность в методы (аннотированные), не беспокоя разработчиков при помощи динамических прокси?Способы инъекции функциональности (аналогичные динамическому прокси, но менее навязчивым)

Классический пример:

public int sum(int x, int y){ 
    StaticInstance.doThisBefore(x,y); // ccc 
    int result = x+y; // business functionality 
    StaticInstance.doThisAfter(result); // ccc 
    return result; 
} 

Так точно, что динамический прокси-сервер может сделать. Проблема с динамическим прокси-сервером - это способ навязчивости.

  • Аннотация процессор позволяет вам только создавать новые классы, но не изменяющие существующие (я правильно?)
  • модифицирующих байт-код?
  • Codeweaver?
  • Агент не может быть использован.

Разработчик может использовать Spring Framework, Java EE или любую основу, он любит, так что это очень важно, чтобы стиль & путь кода разработчика не влияет.

Поэтому очень важно, чтобы этот вариант был неинтрузивным.

+0

Вы хотите изменить источник или байт-код? – ArcticLord

+0

Взгляните на AspectJ? – DavidL

+0

@ArcticLord оба пути возможны - что лучше всего работает? Есть идеи? – Reymanx

ответ

2

Вы можете предоставить абстрактный класс программистам с помощью метода, который вызывает фактический бизнес-метод, который будет реализован из подклассов. Метод, который будет вызывать полную функциональность должна поддерживаться с помощью интерфейса:

public interface Service { 
    int getResult(int x, int y); 
} 

И абстрактный класс реализует интерфейс, но оставляет фактический метод бизнес-логики должны быть реализованы подклассов:

public abstract class AbstractClass implements Service { 
    public int getResult(int x, int y) { 
     StaticInstance.doThisBefore(x,y); // ccc 
     int result = process(x, y); 
     StaticInstance.doThisAfter(result); // ccc 
    } 

    // this is the actual business logic to be implemented by subclasses 
    public abstract int process(int x, int y); 
} 

И подкласс будет осуществлять реальную бизнес-логику, как:

public class MyClass extends AbstractClass { 
    public int process(int x, int y) { 
     return x+y; 
    } 
} 

Итак, разработчик должен помнить только SUBC lass AbstractClass, но его код касается только фактической бизнес-логики.

Наконец, вызов этой службы из кода будет:

Service myService = new MyClass(); 
System.out.println(myService.getResult(5, 6)); 
+0

@Reymanx Этот ответ подходит для вас? Вы хотите принять его? – sanastasiadis