Достъп до методите на препоръчани обекти от изпълнение по подразбиране

Опитвам се да разбера каква е използваемостта на декларациите между типове в Spring AOP, но съм заседнал с един проблем, който го прави малко безполезен.

HelloMixin аспектът декларира, че препоръчаните услуги изпълняват HelloService и предоставя изпълнение по подразбиране HelloServiceImpl.

@Aspect
public class HelloMixin {
    @DeclareParents(value = "xxx.xxx.services.*+", defaultImpl = HelloServiceImpl.class)
    static HelloService mixin;
}

Тогава имам две услуги:

@Service
public class FirstService {
    private String name = "First";
    public String getName() {
        return name;
    }
}

@Service
public class SecondService {
    private String name = "Second";
    public String getName() {
        return name;
    }
}

Нов интерфейс:

public interface HelloService {
    public void sayHello();
}

Реализация по подразбиране:

public class HelloServiceImpl implements HelloService {
    private String getName() {
        return "defaultName";
    }

    @Override
    public void sayHello() {
        System.out.println("Hello " + getName());
    }
}

Екзекуция:

@Autowired
@Qualifier("firstService")
HelloService firstService;

@Autowired
@Qualifier("secondService")
HelloService secondService;

public String hello() {

    firstService.sayHello();
    secondService.sayHello();
}

Резултат:

INFO: Hello defaultName
INFO: Hello defaultName

Тази концепция можеше да бъде наистина страхотна, ако имах начин да използвам getName метода от препоръчани обекти. В противен случай не виждам смисъл да го използвам, ако не мога да напиша никаква обектно-зависима логика. Възможно ли е? С други думи бих искал да видя резултата:

INFO: Hello First
INFO: Hello Second

person Marek Raki    schedule 07.08.2014    source източник
comment
Не. Този код работи. Това е функцията, която се опитвам да разбера :) Повече за това можете да намерите тук: docs.spring.io/spring/docs/3.0.5.RELEASE/reference/aop.html (раздел 7.2.5 Въведение)   -  person Marek Raki    schedule 07.08.2014
comment
Възможно ли е да е дубликат на Пролетно въведение с достъп до оригиналния въведен клас?   -  person Serge Ballesta    schedule 07.08.2014
comment
всъщност, да, много си прилича. Не съм го виждал преди. Предоставеният там отговор не ме удовлетворява, но може и да е правилен :)   -  person Marek Raki    schedule 07.08.2014


Отговори (1)


Можете да го направите, като използвате @DeclareMixin вместо това, което позволява да използвате фабричен метод за създаване на делегат.

@Aspect
public class HelloMixin {
    @DeclareMixin("xxx.xxx.services.*+")
    public HelloService createHelloService(Object target) {
        return new HelloServiceImpl(target);
    }
}

public class HelloServiceImpl implements HelloService {
    private Object target;

    public HelloServiceImpl(Object target) {
        this.target = target;
    }

    @Override
    public void sayHello() {
        System.out.println("Hello " + getNameFromTarget());
    }

    private String getNameFromTarget() {
         // call to this.target.getName()....
    } 

}

Spring AOP не поддържа @DeclareMixin анотация, вижте https://jira.spring.io/browse/SPR-11350, но го добавих към JDAL 2.0 в малък независим модул jdal-aop, затова ви насърчавам да опитате.

person Jose Luis Martin    schedule 08.08.2014