在java中,我想实现代理类(代理工厂Bean),它将采用多个目标(实现相同的接口(interface))并调用基于配置值的目标方法之一。
Dog 和 Cat 实现 Animal 并基于某些配置值(Y 或 N)想要调用其实现之一。这可以使用策略来完成,但我的问题是,类似的逻辑需要应用于实现不同接口(interface)的其他实现。(下面的示例,我在下面添加了实现汽车接口(interface)的奥迪和奔驰类)并希望根据配置选择实现。
public interface Animal
{
public void sound();
}
public class Dog implements Animal
{
public void sound()
{
System.out.print("bark");
}
}
public class Cat implements Animal
{
public void sound()
{
System.out.print("Meow");
}
}
第二个 bean :
public interface Car
{
public void make();
}
public class Audi implements Car
{
public void make()
{
System.out.print("Audi");
}
}
public class Benz implements Car
{
public void make()
{
System.out.print("Mercedes");
}
}
Spring 配置示例
<bean id "animalService" class="proxyFactoryBean">
<list>
<target id"Y". "class"="com.Dog">
<target id"N". "class"="com.Cat">
<list>
</bean>
<bean id "carService" class="proxyFactoryBean">
<list>
<target id"Y". "class"="com.Audi">
<target id"N". "class"="com.Benz">
<list>
</bean>
并在 Controller 中注入(inject)相同的接口(interface)(汽车,动物)并调用原始方法,而无需任何代理注入(inject)。
有人可以建议如何使用 SpringProxyFactoryBean 或自定义实现来完成它吗?
基本上在代理类中,我想检查配置值,并根据配置值调用该特定实现对象上的方法。
如果配置值为 Y ,则从定义的目标列表中获取代理中的 Y bean 引用并调用其方法。
最佳答案
当您想要在调用目标实现之前拦截对方法调用(最好是接口(interface)方法)的请求时,通常会使用代理。
Spring 在 ProxyFactoryBean 的帮助下允许这样做。您将其配置为代理一个或多个接口(interface)(不同种类)以及目标实现和一个或多个拦截器。当您请求实现这些接口(interface)中的任何一个时,配置的拦截器有机会进行嗅探,但最终会调用目标类上的调用方法。
不太确定您的最终目标是什么,但您要做的就是创建一个间接寻址,并根据某些条件调用 A 类实现或 B 类实现。 ProxyFactoryBean 并没有直接解决这个问题。
其中一个选项是为 ProxyFactoryBean 创建多个 Spring 托管 bean,每个实现一个,并按名称从工厂获取 bean。他们的 ID 名称显然会不同。
第二个选项是让您创建实现该接口(interface)的第三个类,将该类指定为 Spring 配置中的目标,并根据您的条件调用 A 类实现或 B 类实现。看一下示例代码片段。
class CarDecider implements Car{
/*
either get Audi impl from BeanFactory or ApplicationContext
if they are configured beans
or create a new instance in case you don't have access to
BeanFactory and serving through singleton instance is not a
requirement
*/
public void make(){
if(<your condition for Audi true>){
beanFactory.getBean(Audi.class).make();
// OR
new Audi().make();
}else{
beanFactory.getBean(Benz.class).make();
// OR
new Benz().make();
}
}
}
第三种选择是完全避免使用 ProxyFactoryBean。使用不同的名称注册接口(interface)的两个实现,并根据 BeanFactory 的条件请求它们。
关于java - 如何为ProxyFactoryBean设置多个目标并根据Config调用其中一个目标方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60556263/