-
2018-04-14 21:49:38
目的:一个接口多个实现时,根据不同的条件调用不用的实现
1、有如下接口
public interface Pay { public Object pay(Map<String,Object> map); }
2、有如下两个实现
实现一:
@Service("weixinPay") public class WeixinPay implements Pay{ @Override public Object pay(Map<String, Object> map){ return "weixinpay"; } }
实现二:
@Service("aliPay") public class AliPay implements Pay{ @Override public Object pay(Map<String, Object> map){ return "alipay"; } }
3、根据不同的条件调用不同的实现
方法一:
@Resource(name="weixinPay") ShopPay weixinPay; @Resource(name="aliPay") ShopPay aliPay;
方法二:
@Autowired @Qualifier("weixinPay") ShopPay weixinPay; @Autowired @Qualifier("aliPay") ShopPay aliPay;
更多相关内容 -
一个类可以实现多个接口,但只能继承一个抽象类。
2018-12-25 22:01:55而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个...接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public abstract class BaseServlet extends HttpServlet {
public final void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 记录访问日志
// 进行权限判断
}protected abstract void doService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException;
// 注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的
}class MyServlet1 extends BaseServlet {
protected void doService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 本Servlet只处理的具体业务逻辑代码
}
}父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。
-
Spring一个接口多个实现类,一个实现类实现多个接口,注入方法
2019-06-26 15:32:171、一个实现类实现多个接口 例如:serviceImpl implements Interface1,Interface2 在controller中 @AutowiredInterface1 只能调用Interface1接口的方法 总结,注入单个接口,只能调用对应的接口方法 2、一个...1、一个实现类实现多个接口
例如:serviceImpl implements Interface1,Interface2
在controller中
@Autowired Interface1
只能调用 Interface1接口的方法
总结,注入单个接口,只能调用对应的接口方法
2、一个接口多个实现类,注入指定的实现类
例如:Interface 接口有两个实现类 InterfaceImpl1 和 InterfaceImpl2
//实现类1
@Service
public class InterfaceImpl1 implements Interface {//实现类1
@Service
public class InterfaceImpl2implements Interface {//业务类,controller
@Autowired Interface
private Interface interface;
按照上面的写法,启动服务时会报错
解决方法
1.指明实现类的优先级,注入的时候使用优先级高的实现类
//实现类1
@Service
@Primary //同一个接口的实现类,最多只能有一个添加该注解
public class InterfaceImpl1 implements Interface {在controller中注入接口,默认使用的是Primary 标注的实现类的方法
2.通过 @Autowired 和 @Qualifier 配合注入
@Autowired
@Qualifier("interfaceImpl1")
Interface1 interface1; //正常启动3.使用@Resource注入,根据默认类名区分
@Resource(name = "interfaceImpl1")
Interface1 interface1; //正常启动4.使用@Resource注入,根据@Service指定的名称区分
需要在实现类@Service后设置名称:
@Service("s1")
public class InterfaceImpl1 implements Interface {@Resource(name = "s1")
Interface1 interface1; //正常启动spring常用注解说明
- @Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
- @Scope注解 作用域
- @Lazy(true) 表示延迟初始化
- @Service用于标注业务层组件、
- @Controller用于标注控制层组件(如struts中的action)
- @Repository用于标注数据访问组件,即DAO组件。
- @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
- @Scope用于指定scope作用域的(用在类上)
- @PostConstruct用于指定初始化方法(用在方法上)
- @PreDestory用于指定销毁方法(用在方法上)
- @Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
- @DependsOn:定义Bean初始化及销毁时的顺序
- @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
- @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
- @Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
-
为什么Java中一个类可以实现多个接口,但只能继承一个类?
2019-12-27 09:16:14多继承会产生钻石问题(菱形继承) 类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法 ...接口中的方法是抽象的,一个类实现可以多个接口 假设这些接口中存在相同方法(方法名与参数相同),...多继承会产生钻石问题(菱形继承)
- 类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法
- 类 D 同时继承了类 B 和类 C
- 对于类 B、C 重写的类 A 中的方法,类 D 会继承哪一个?这里就会产生歧义
- 考虑到这种二义性问题,Java 不支持多重继承
Java 支持类实现多接口- 接口中的方法是抽象的,一个类实现可以多个接口
- 假设这些接口中存在相同方法(方法名与参数相同),在实现接口时,这个方法需要实现类来实现,并不会出现二义性的问题
从 JDK1.8 开始,接口中允许有静态方法和方法默认实现。当检测到实现类中实现的多个接口中有相同的默认已实现的方法,编译报错
PS:在JDK 1.5 上实践,接口可以多继承接口package constxiong.interview; /** * 测试继承多接口,实现相同方法 * 从 JDK1.8 开始,接口中允许有静态方法和方法默认实现 * 当检测到实现类中实现的多个接口中有相同的默认已实现的方法,编译报错 * @author ConstXiong * @date 2019-11-21 10:58:33 */ public class TestImplementsMulitInterface implements InterfaceA, InterfaceB { public void hello() { System.out.println("hello"); } } interface InterfaceA { void hello(); static void sayHello() { System.out.println("InterfaceA static: say hello"); } default void sayBye() { System.out.println("InterfaceA default: say bye"); } } interface InterfaceB { void hello(); static void sayHello() { System.out.println("InterfaceB static: say hello"); } // default void sayBye() { // System.out.println("InterfaceB default: say bye"); // } }
【Java面试题与答案】整理推荐
-
接口,抽象类;类可以实现多个接口,类只能继承一个类,接口可以继承多个接口
2019-07-15 14:56:35接口 接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。 -
一个类可以实现多个接口但是只能实现一个类
2019-04-10 16:05:39一个类可以实现多个接口,但是只能继承一个类 -
一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?
2021-09-05 15:53:24一个接口对应多个实现类 一个接口对应对个实现类,需要注入指定的实现类。 如:Interface接口下有两个实现类InterfaceImpl1和InterfaceImpl2。 接口: package com.example.service; public interface Interface1... -
一个接口多个实现类的Spring注入方式
2018-05-29 18:06:25一个接口多个实现类 - Spring 的 @Autowired 和 @Qualifier 配合注入 1. 首先, Interface1 接口有两个实现类 Interface1Impl1 和 Interface1Impl2 Interface1 接口: package com.example.service; /** * ... -
@Autowired一个接口有多个实现类
2019-04-24 17:25:34@Autowired是spring的注解,默认使用的是byType的方式向Bean里面注入相应的Bean。例如: @Autowired private UserService userService; 这段代码会在初始化的时候...但是如果UserService这个接口存在多个实现类的时... -
Spring如何自动注入一个接口多个实现实例
2019-06-12 19:37:25如题所述,当一个接口被多个子类实现时,Spring框架怎样从容器中正确取出我们想要的实例呢? (定义了CommonService接口,同时有个两个子类实现了这个接口,同时两个实现类上都加了@Service注解,表明在项目启动... -
@Qualifier:一个接口或服务有多个实现,如何指定实现类
2016-12-13 12:56:01接口或服务 public interface CacheServiceextends Serializable, K extends Serializable> { ...实现类1 @Service("redisCacheService") public class RedisCacheServiceImpl implements CacheService { -
spring注解识别一个接口的多个实现类方法
2017-07-12 19:26:08spring注解识别一个接口的多个实现类方法,在引用类中匹配到正确的实现类接口如下:public interface Filter { public String doFilter(String param); }接口实现类:public class TimeFilter implements Filter {... -
一个接口有多个实现类,当调用接口中的方法时,如何判定用的是哪个实现类
2019-05-11 21:33:55一、简单例子: 1.直接new一个实例,这样肯定知道用的哪个实例 2.定义接口类型的变量,...举个例子:A接口,A1,A2,A3实现A接口,有一个eat方法,A1:吃饭,A2:吃鱼,A3:吃肉 需要得到"吃肉",那么Aa=newA3(); ... -
spring注入接口还是实现类,同一接口有多个实现类,如何注入
2019-02-15 11:42:261、接口:IUserService public interface IUserService { ...2、实现类:UserServiceImpl,实现了UserService接口 @Service("UserServiceImpl ") public class UserServiceImpl implements IUser... -
springboot中一个service接口多个实现类,如何注入
2020-05-09 08:17:50一般来说我们的service接口都是只有一个实现类而已,但有些时候,确实会有两个实现类的情况,那这个时候我们怎么自动注入这个接口呢? 1、首先,有一个接口PersonService,然后再写两个实现类PersonServiceImp1、... -
java类支持多继承么?可以实现多个接口么?
2018-11-16 14:41:42java 不支持多继承,但类可以实现多个接口,间接的实现多继承,也可以通过内部类。 参考代码:MultiExtendsTest // 测试间接的实现多继承 public class MultiExtendsTest extends D implements A, B, C { @... -
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
2019-04-10 10:58:02如果一个接口有2个不同的实现, 那么怎么来Autowire一个指定的实现? 举个例子: 1、接口:ILayer public Interface ILayer{ ...... } 2、实现类:ImageLayerImpl ,实现了ILayer接口。 @Service(... -
设计模式-代理类proxy:一个接口多个实现类(基于spring框架)
2016-08-30 17:32:05根据前台返回的不同参数,选择一个接口不同的实现类来实现不同业务逻辑,我们用到了proxy代理类。 首先是spring.xml 配置文件 如下:(proxy 代理类 ××ServiceImpl实现类) 代理类代码 ... -
为什么需要一个接口,一个接口的实现类,而不是直接调用类里的方法
2018-07-13 10:20:42商业转载请联系作者获得授权,非商业转载请注明出处。“接口是个规范”,这句没错。“不如直接就在这个类中写实现方法岂不是...如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?既然不是一个类去实现,... -
【springboot】接口多实现类,选择性注入的4种解决方案
2022-03-03 14:12:57在SpringBoot环境下,当一个接口有多个实现类,怎么样根据配置方便快捷的切换实现类,并实现依赖注入?欢迎大家点击进来学习! -
spring注解识别一个接口的多个实现类
2017-04-10 13:34:111.比如有一个接口如下: [java] view plain copy public interface Filter { public String doFilter(String param); } 2.有如下接口实现类: ... -
Android使用协程(Coroutine)优雅的处理多个接口同时请求(网络并发请求)
2019-09-19 14:34:42我在之前写过一篇关于 高德逆地理编码接口返回数据格式不统一以及百度逆地理编码接口返回数据解析失败的踩坑记录 这篇文章,我当时的需求是要结合高德和百度两个接口,合并成一个我想要的数据。在文章中,我们使用了... -
spring自动注入接口的多个实现类(结合策略设计模式)
2019-05-22 12:40:52在使用spring开发的时候,有时候会出现一个接口多个实现类的情况,但是有没有有时候有这样一种情况,就是你的逻辑代码里面还不知道你需要使用哪个实现类,就是比如说:你去按摩,按摩店里面有几种会员打折,比如有,... -
java开发中调用一个接口的方法时是怎么调用到该接口的实现类的?
2018-03-15 05:10:45java开发中调用一个接口的方法时是怎么调用到该接口的实现类的? -
一个接口,有多个实现类,在使用这个接口的时候,如何判断用的是哪个实现类。
2016-05-20 08:35:07hibernate的Session接口,查看文档发现它被4个类实现了,所以就有疑问,当我开始调用Session中的方法时,它到底是被哪个实现类所实现的? ![图片说明]... -
请问Java中两个类实现同一个接口的问题
2016-10-20 10:33:27现有Class A,Class B,interface C C中有一个f()的空方法,A中有对这个f()的具体实现 请问B能不能直接调用A中实现好了的f()方法?如果不能,该怎么办才可以调用? -
IDEA查找接口实现类及快速实现接口的方法及常用快捷键
2020-02-15 18:03:53查找接口的实现类: IDEA 风格 ctrl + alt +B IDEA快速实现接口快捷方式 ALT +INSERT 例如:查看Subject接口的实现类; 一.常用快捷键(这些我们经常用) Alt + Enter 引入类 Ctrl + O 查看我们继承的类... -
Spring注解——同一接口有多个实现类,如何注入?@Resource、@Autowired、@Qualifier
2018-07-10 15:24:27先写一个场景,举例说明:1、接口:IAnimalpublic Interface IAnimal{ ...... }2、实现类:DogImpl ,实现了IAnimal接口。@Service("dogImpl") public class DaoImpl impliments IAnimal{ ... }3、...