Я пытаюсь разработать простую червоточину с использованием AspectJ и cflow.Как реализовать шаблон Wormhole с AspectJ (cflow)
У меня есть два значения объектов Person и счета, как показано ниже
СЧЕТ
public class Account {
private final String sortCode;
private final String accountNumber;
private final int balance;
public Account(String sortCode, String accountNumber, int balance) {
this.sortCode = sortCode;
this.accountNumber = accountNumber;
this.balance = balance;
}
public String getSortCode() {
return sortCode;
}
public String getAccountNumber() {
return accountNumber;
}
public int getBalance() {
return balance;
}
@Override
public String toString() {
return "Account{" +
"sortCode='" + sortCode + '\'' +
", accountNumber='" + accountNumber + '\'' +
", balance=" + balance +
'}';
}
}
Person
public class Person {
private final String name;
private final String address;
private final int age;
public Person(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", age=" + age +
'}';
}
}
И три "Слои"
слоя А
public class Layer_A {
public void doSomeLevelAprocess(Person person){
System.out.println("doSomeLevelAprocess person " + person);
new Layer_B().doSomeLevelBprocess();
}
}
слой В
public class Layer_B {
public void doSomeLevelBprocess(){
System.out.println("doSomeLevelBprocess");
new Layer_C().doSomeLevelCprocess(new Account("123456", "87654321", 1001));
}
}
слой С
public class Layer_C {
public void doSomeLevelCprocess(Account account){
System.out.println("doSomeLevelCprocess ");
}
}
Я хотел бы иметь Person
объект то будет передано Layer_A
методы doSomeLevelAprocess
, доступный на Layer_C
метод doSomeLevelCprocess
Возможно ли это?
мой аспект выглядит это
public aspect WormWhole {
pointcut callerSpace(Person person): execution(* Layer_A.*(..)) && this(person);
pointcut calleeSpace(Account account): this(account) && execution(public * Layer_C.*(..));
pointcut wormhole(Person person, Account account):
cflow(callerSpace(person)) && calleeSpace(account);
before(Person person, Account account):
wormhole(person, account){ **//WHAT DO I DO HERE?????** }
}
Отобрали I callerSpace и срезов в calleeSpace правильно?
Какая логика требуется
before(Person person, Account account):
wormhole(person, account){ **//WHAT DO I DO HERE?????** }
UPDATE
«возможного Дубликат» вопрос на самом деле не показывают, как достичь червоточину, он просто показывает «шаблон» для червоточины AspectJ , Кроме того, ответ на заданный вопрос не пытается передать контекст через несколько слоев, что является всей точкой червоточины.
UPDATE
Когда я изменить советы это: -
public aspect WormWhole {
pointcut callerSpace(Person person): execution(* Layer_A.*(..)) && this(person);
pointcut calleeSpace(Account account): this(account) && execution(public * Layer_C.*(..));
pointcut wormhole(Person person, Account account):
cflow(callerSpace(person)) && calleeSpace(account);
before(Person person, Account account):
wormhole(person, account){
System.out.println("Wormhole - " + person);
System.out.println("Wormhole - " + account);
}
}
Я получаю этот выход: -
doSomeLevelAprocess person Person{name='aaa', address='aaa', age=19}
doSomeLevelBprocess
doSomeLevelCprocess
Process finished with exit code 0
Это доказывает мои срезов в не правильно (я считаю,), но почему????
UPDATE
Я добавил в простой срезом точек, который отлично работает
public aspect WormWhole {
pointcut callSayHello(): call(* Layer_A.*(..)) || call(* Layer_B.*(..)) || call(* Layer_C.*(..)) ;
pointcut callerSpace(Person person): execution(* Layer_A.*(..)) && this(person);
pointcut calleeSpace(Account account): this(account) && execution(public * Layer_C.*(..));
pointcut wormhole(Person person, Account account):
cflow(callerSpace(person)) && calleeSpace(account);
before(Person person, Account account):
wormhole(person, account){
System.out.println("Wormhole - " + person);
System.out.println("Wormhole - " + account);
}
after() : callSayHello() {
System.out.println("After call sayHello" + thisJoinPoint);
}
}
Выход из выполнения теста
doSomeLevelAprocess person aaa
doSomeLevelBprocess
doSomeLevelCprocess account 87654321
After call sayHellocall(void Layer_C.doSomeLevelCprocess(Account))
After call sayHellocall(void Layer_B.doSomeLevelBprocess())
After call sayHellocall(void Layer_A.doSomeLevelAprocess(Person))
Process finished with exit code 0
Я использую караты в IntelliJ 14.1.14
с aspectjrt-1.8.6.jar
возможный дубликат [Реализация шаблона червоточины с использованием AspectJ] (http://stackoverflow.com/questions/12129562/implementing-a-wormhole-pattern -using-aspectj) –
Этот вопрос/ответ (ы) не объясняет, КАК достичь желаемого результата. Также, что код примера вопросов не имеет нескольких слоев для прохождения через – Hector
Я тот, кто ответил на другой вопрос. Я на самом деле не пытался запускать ваш код, но на первый взгляд pointcuts выглядят хорошо. Что касается вашей озабоченности по поводу количества уровней, это просто не имеет значения - вот в чем суть червячной схемы. Что касается вашего вопроса «что мне здесь делать?» - Ну, это зависит от вас. Попробуйте напечатать два объекта, например. Если вы можете их распечатать, вы также можете сделать с ними что-нибудь еще. Это зависит только от того, чего вы хотите достичь. Что бы вы ни делали, в основном вы используете объект 'Person' в контексте выполнения объекта' Account' - круто, не так ли? – kriegaex