java interface有多个implement的情况下,@Inject调用实现类的选择

java原生代码:

public interface InterfaceService<T extends BaseObject> {

    void getServiceName(T t);

}

public class AImplementService implements InterfaceService<AObject> {

    @Override
    public void getServiceName(AObject a) {
        System.out.println("AImplementService.getServiceName");
    }

}

public class BImplementService implements InterfaceService<BObject> {

    @Override
    public void getServiceName(BObject b) {
        System.out.println("BImplementService.getServiceName");
    }

}

public class InterfaceServiceTest {

    @Inject
    InterfaceService<AObject> serviceA;

    @Inject
    InterfaceService<BObject> serviceB;

    @Test
    public void test() {
        serviceA.getServiceName(new AObject());
        serviceB.getServiceName(new BObject());
    }

}
结果:

AImplementService.getServiceName
BImplementService.getServiceName

当框架不支持多实现,但是又需要面向接口编程,需要Inject接口,则有另一种方式

public interface InterfaceService {
    void get() ;
}

public interface InterfaceServiceA extends InterfaceService {}

public class AImplementService implements InterfaceServiceA {
    public void get() {
        //...
     }
}

public interface InterfaceServiceB extends InterfaceService {}

public class BImplementService  implements InterfaceServiceB {
    public void get() {
        //...
     }
}
然后使用
@Inject
private InterfaceServiceA interfaceServiceA;

@Inject
private InterfaceServiceB  interfaceServiceB;

以下转自51CTO
@BindingAnnotation实现多实现注入
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Changchun {
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Jilin {
}

public class ChangchunSunyangImpl implements Sunyang{
public void print() {
System.out.println("三扬长春");
}
}

public class JilinSunyangImpl implements Sunyang{
public void print() {
System.out.println("三扬吉林");
}

public class Bind implements Module {
public void configure(Binder binder) {
binder.bind(Sunyang.class).annotatedWith(Changchun.class).to(
ChangchunSunyangImpl.class);
binder.bind(Sunyang.class).annotatedWith(Jilin.class).to(
JilinSunyangImpl.class);
}
}

public class InjectBind {
@Inject
@Changchun
Sunyang changchunSunyang;

@Inject 
@Jilin
Sunyang jilinSunyangImpl;

public static void main(String[] args){
InjectBind ib=Guice.createInjector(new Bind()).
getInstance(InjectBind.class);
ib.changchunSunyang.print();
ib.JilinSunyang.print();
}
}


spring的@Autowire @Qualifier @Resource @Component使用



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好,欢迎使用ChitGPT进行智能对话。 关于您的问题,我可以为您提供如下解答: 根据您的需求,可以使用工厂模式和适配器模式来设计一个符合要求的增删改查方法,其中工厂模式可以用来创建不同的interface实例,而适配器模式可以用来将不同的实现适配到统一的interface上,从而实现统一调用。 具体实现如下所示: 1. 创建四个接口,分别对应增删改查四个操作: ```java public interface AddInterface<T> { void add(T entity); } public interface DeleteInterface<T> { void delete(T entity); } public interface UpdateInterface<T> { void update(T entity); } public interface QueryInterface<T> { T query(String name); } ``` 2. 创建四个实现实现相应的接口: ```java public class AddImplement<T> implements AddInterface<T> { @Override public void add(T entity) { // 实现添加操作 } } public class DeleteImplement<T> implements DeleteInterface<T> { @Override public void delete(T entity) { // 实现删除操作 } } public class UpdateImplement<T> implements UpdateInterface<T> { @Override public void update(T entity) { // 实现修改操作 } } public class QueryImplement<T> implements QueryInterface<T> { @Override public T query(String name) { // 实现查询操作 return null; } } ``` 3. 创建工厂来创建相应的实例: ```java public class Factory { public static AddInterface getAddInstance() { return new AddImplement(); } public static DeleteInterface getDeleteInstance() { return new DeleteImplement(); } public static UpdateInterface getUpdateInstance() { return new UpdateImplement(); } public static QueryInterface getQueryInstance() { return new QueryImplement(); } } ``` 4. 创建适配器来将多个实现适配到一个interface上: ```java public class Adapter { public static AddInterface getAddInstance(Object implement) { return new AddInterface() { @Override public void add(Object entity) { ((AddInterface) implement).add(entity); } }; } public static DeleteInterface getDeleteInstance(Object implement) { return new DeleteInterface() { @Override public void delete(Object entity) { ((DeleteInterface) implement).delete(entity); } }; } public static UpdateInterface getUpdateInstance(Object implement) { return new UpdateInterface() { @Override public void update(Object entity) { ((UpdateInterface) implement).update(entity); } }; } public static QueryInterface getQueryInstance(Object implement) { return new QueryInterface() { @Override public Object query(String name) { return ((QueryInterface) implement).query(name); } }; } } ``` 5. 创建调用示例: ```java public class Example { public static void main(String[] args) { AddInterface add = Adapter.getAddInstance(Factory.getAddInstance()); DeleteInterface delete = Adapter.getDeleteInstance(Factory.getDeleteInstance()); UpdateInterface update = Adapter.getUpdateInstance(Factory.getUpdateInstance()); QueryInterface query = Adapter.getQueryInstance(Factory.getQueryInstance()); add.add(new Object()); delete.delete(new Object()); update.update(new Object()); Object object = query.query("name"); } } ``` 这样,您就可以通过一个interface来统一调用所有增删改查操作了,而无需指定具体使用哪个interface。同时,根据不同的实现,适配器会将相应的实现适配到对应的interface上。 希望这个回答能够帮到您。如果您有其他问题,可以继续向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenjian0415

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值