gpt4 book ai didi

java - 从默认实现访问建议的对象方法

转载 作者:行者123 更新时间:2023-11-30 11:15:48 25 4
gpt4 key购买 nike

我试图找出 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

最佳答案

您可以改用 @DeclareMixin 来完成,这允许使用工厂方法来创建委托(delegate)。

@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 ,所以我鼓励你尝试一下。

关于java - 从默认实现访问建议的对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25181107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com