精华内容
下载资源
问答
  • SpringBoot项目中可能出现一个接口多个实现类的情况,如果不进行配置,注入接口时编译器不知道要注入哪个实现就会报错,因此需要进行配置。以下进行举例: 接口如下: public interface NoticeService { ...
    • SpringBoot项目中可能出现一个接口有多个实现类的情况,如果不进行配置,注入接口时编译器不知道要注入哪个实现类就会报错,因此需要进行配置。以下进行举例:
    • 接口如下:
    public interface NoticeService {
        public String noticeUser(Long id);
    }
    
    • 两个实现类如下:
    @Service
    public class NoticeServiceImpl1 implements NoticeService {
    	public String noticeUser(Long id){
    		return noticeServe1(id);
    	}
    }
    
    @Service
    public class NoticeServiceImpl2 implements NoticeService {
    	public String noticeUser(Long id){
    		return noticeServe2(id);
    	}
    }
    
    • Controller如下:
    @Controller
    @RequestMapping("notice")
    public class NoticeController{
    	@Autowired
    	NoticeService noticeService;
    }
    
    • 这样直接启动后就会报错,需要在添加@Qualifier注解:
    @Controller
    @RequestMapping("notice")
    public class NoticeController{
    	@Autowired
    	@Qualifier("impl1")
    	NoticeService noticeService;
    }
    
    • 需要调用的实现类中添加标识:
    @Service("impl1")
    public class NoticeServiceImpl1 implements NoticeService {
    	public String noticeUser(Long id){
    		return noticeServe1(id);
    	}
    }
    

    此时再运行即可

    展开全文
  • 1、接口:IUserService public interface IUserService { ...2、实现类:UserServiceImpl,实现了UserService接口 @Service("UserServiceImpl ") public class UserServiceImpl implements IUser...

    1、接口:IUserService

    public interface IUserService {
    
        public void sayHello();
    }

    2、实现类:UserServiceImpl,实现了UserService接口

    @Service("UserServiceImpl ")
    public class UserServiceImpl implements  IUserService{
    
        // 添加属性:
        private String name;
    
        @Override
        public void sayHello() {
            System.out.println("Hello Spring: " + name);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    3、业务类:Controller

        public class Controller {
            @Autowired
            private IUserService iUserService;
            ......
        }

    假如有一个接口 IUserService, UserServiceImpl类实现了接口 UserServiceImpl, 且该接口只有 UserServiceImpl这一个实现类,那么在引用实现类的时候,我们使用的是实现类的接口(像上面程序展示的那样)。Spring会按 byType的方式寻找接口的实现类,将其注入。

    假如有另一个实现类 UserServiceImpl2 也实现了接口 IUserService, 这时候再按上面的方式去引用, 在同时存在两个实现类的情况下,会报错。

    因为@Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。

    可以通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解

    @Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。所以上面的引用可以替换为:

      public class Controller {
            @Resource(name="UserServiceImpl")
            private IUserService iUserService;
            ......
        }

    @Qualifier 注解也是 byName的方式,但是与@Resource 有区别,@Qualifier 使用的是 类名

      public class Controller {
            @Qualifier("UserServiceImpl")
            private IUserService iUserService;
            ......
        }

    spring 到底注入接口还是实现类?

    <bean id="userService" class="com.lby.demo1.UserServiceImpl">
            <property name="name" value="李四"/>
    </bean>

    可以看到,在 applicationContext.xml 里bean id为接口名,但是实际的类却是实现类,我们在注入时

    // 创建Spring的工厂
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    // 通过工厂获得类:
    // 下面相当于UserService userService = new UserServiceImpl();
    UserService userService = (UserService) applicationContext.getBean("userService");

    实际上getBean会返回一个父类object,然后我们再强转为子类接口 UserService

    在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行

    接口的实现关系同理,接口相当于接口的实现类

    如上面所说,@autowired自动寻找 applicationContext.xml 里 该接口的实现类,而@Resource根据bean id 注入在赋值给注释下的接口

    @autowired和@Resourc相当于  UserService userService = (UserService) applicationContext.getBean("userService");

     

    展开全文
  • 最近写了前台一个管理模块,后来也是我来写,采用四层架构,在定义接口时,基本是一个接口对应一个实现,使用@Autowired注解,但我想如果有多个实现类,如何注解,来梳理一下 举例说明: 1、接口:IAnimal 2、实现...

    最近写了前台一个管理模块,后来也是我来写,采用四层架构,在定义接口时,基本是一个接口对应一个实现类,使用@Autowired注解,但我想如果有多个实现类,如何注解,来梳理一下

    举例说明:

    1、接口:IAnimal

    public Interface IAnimal{
    	......
    }
    

    2、Impl实现:DogImpl ,实现了IAnimal接口。

    @Service("dogImpl")
    public classDaoImpl impliments Animal{
    	...
    }
    

    3、Controller:AnimalController

    public class AnimalController{
    	@Autowired
    	private IAnimal dogImpl;
    	......
    }
    

    假如有一个“动物”的接口 IAnimal, DogImpl类实现了接口 IAnimal, 且该接口只有 DogImpl这一个实现类,那么在引用实现类的时候,我们使用的是实现类的接口(像上面程序展示的那样)。Spring会按 byType的方式寻找接口的实现类,将其注入。

    假如有另一个实现类 CatImpl 也实现了接口 IAnimal, 这时候再按上面的方式去引用, 在同时存在两个实现类的情况下,会出现什么情况呢?

    答:会报错。 这是由于 @Autowired 的特性决定的: @Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。

    那么在同一类型拥有多个实现类的时候,如何注入呢?

    答:这种场景下,只能通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解。

           @Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。所以上面的引用可以替换为:

    public class AnimalController{
    	@Resource(name="dogImpl")
    	private IAnimal dogImpl;
    	......
    }
    

    @Qualifier 注解也是 byName的方式,但是与@Resource 有区别,@Qualifier 使用的是 类名。

    public class AnimalCOntroller{
    	@Qualifier("DaoInpl")
    	private IAnimal dogImpl;
    	...
    }
    

    总结:

    1、@Autowired 是通过 byType 的方式去注入的, 使用该注解,要求接口只能有一个实现类。

    2、@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。

    3、@Qualifier 注解可以按名称注入, 但是注意是 类名。

    展开全文
  • 如果一个接口存在多个实现类,而且多个实现类都被注入到spring容器中...这个时候如果一定要将多个bean都注入在一个bean中注入同一个接口多个实现类的方法,大体思路有两种,一种是通过map将多个bean都统一注入到b...

    如果一个接口存在多个实现类,而且多个实现类都被注入到spring容器中了,如果需要将它们都注入到同一个bean中或者想要动态获取某一个bean的时候会发现一些问题,首先是如果只是单独注册一个bean而且还是按照"ByType"注册的,那么还出现异常。

    这个时候如果一定要将多个bean都注入在一个bean中注入同一个接口的多个实现类的方法,大体思路有两种,一种是通过map将多个bean都统一注入到bean中,还有一种是通过spring的上下文对象将需要的bean拿出来。

    1. Map<String, [接口]>
    2. ApplicationContext

    假设有如下接口

    public interface Test {
    	public void test();
    }
    

    有如下两个实现类需要注入spring容器

    @Component
    public class TestA implements Test{
    	@Override
    	public void test() {
    		System.out.println("TestA");
    	}
    }
    
    @Component
    public class TestB implements Test{
    	@Override
    	public void test() {
    		System.out.println("TestB");
    	}
    }
    

    可以通过map将两者都注入bean中,可以通过map的key拿出对应的bean

    @Component
    public class TestService {
    
    	@Autowired
    	Map<String, Test> testMap;
    
    	public void selectTest(String str){
    		if(str.equals("A")){
    			testMap.get("testA").test();
    		}else if (str.equals("B")){
    			testMap.get("testB").test();
    		}
    	}
    }
    

    还可以通过实现ApplicationContextAware接口得到ApplicationContext对象,并且从中拿到需要的bean对象,这种做法类似于解决单例中多例注入问题和spring事务失效问题。

    @Component
    public class TestService implements ApplicationContextAware {
    
    	ApplicationContext applicationContext;
    
    	Test test;
    
    	public void selectTest(String str){
    		if(str.equals("A")){
    			test = (Test) applicationContext.getBean("testA");
    			test.test();
    		}else if (str.equals("B")){
    			test = (Test) applicationContext.getBean("testB");
    			test.test();
    		}
    	}
    
    	@Override
    	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    		this.applicationContext = applicationContext;
    	}
    }
    

    这样就可以得到指定的bean

    public static void main(String[] args) {
    	AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    	TestService testService = (TestService) annotationConfigApplicationContext.getBean("testService");
    	testService.selectTest("A");
    }
    

    结果

    TestA
    
    展开全文
  • 一般来说我们的service接口都是只有一个实现类而已,但有些时候,确实会有两个实现类的情况,那这个时候我们怎么自动注入这个接口呢? 1、首先,有一个接口PersonService,然后再写两个实现类PersonServiceImp1、...
  • 现有Class A,Class B,interface C C中有一f()的空方法,A中有对这f()的具体实现 请问B能不能直接调用A中实现好了的f()方法?如果不能,该怎么办才可以调用?
  • 先写一场景,举例说明:1、接口:...}2、实现类:DogImpl ,实现了IAnimal接口。@Service("dogImpl") public class DaoImpl impliments IAnimal{  ... }3、业务:AnimalControllerpublic class Anima...
  • @Autowired注解一次将同一接口多个实现类全部注入,只需要在注入时以List/Map形式定义要注入的接口即可。 /** * 定义接口 */ public interface LoginService { void sout(); } /** * 实现...
  • Spring 同一接口注入多个bean实现

    千次阅读 2018-06-21 12:01:00
    如果同一个接口多个bean实现类,spring在运行时会出现如下异常 required a single bean, but 2 were found:marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using ...
  • 我们在springboot项目当中需要在保存文件,你配置了...首先你的接口层 然后Service层,分别有3 注意一点是 @Configuration @ConditionalOnProperty(name = “File_upload_mode”, havingValue = “FastDFS”)...
  • 背景:项目中有多个组件调用同一接口,为提高代码可维护性,需要封装公共方法 直接return 接口调用的结果 export function getAll() { let all = []; let opt = { method: 'get', url: 'all/...
  • 一个接口多个实现类,Controller方法中动态调用具体都实现类接口实现1实现2ControllerSystem.out.println输出结果 接口 public interface IDemoService { public String test(); } 实现1 @Service(...
  • 今天看《JAVA编程思想》,看到泛型的时候看到**“一个类不能实现同一泛型接口的两种变体”**(P401) 这样一句话,请问为什么 例子一 ![图片说明]...
  • 如果同一接口多个实现类 该如何对该类型的子类进行依赖注入 @AutoWired @Qualifier(“dog”) // 注入Animal实现Dog Animal animal;
  • 一个接口多个实现方法具体调用

    千次阅读 2020-01-06 18:08:26
    1.如果这个接口下的实现类我们都要遍历调用 可以在impl中: //DimensionDetailService为接口 @Autowired privat Map<String,DimensionDetailService> map; //然后就可以遍历调用啦 map.values()....
  • 一个接口多个实现类,如何指定特定实现进行调用示例解决方法 在写程序的时候经常会遇到 写一个接口多个实现类,那么在调用的时候是如何去确定调用的是哪个实现呢?接下来将为你介绍几种方式: 示例 总接口 ...
  • spring中如何注入同一接口的不同实现类 scope范围注解,限定单实例还是实例
  • 相应的包 import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired;... @Qualifier("teacher") //指定实现类 private ITeacherDao td; }  
  • 实现动态调用,方法有很种,在这里记下一种我觉得...接口类 package com.su.mybatis.oracle.service; public interface TestService { String firstStep(); String secondStep(); String thirdStep(); ...
  • 如果一个接口有2个以上不同的实现, 那么如何Autowire一个指定的实现 ...2:以下是UserService接口的两个实现类UserService1和UserService2,请注意@service注解的使用方式,这里给每个实现类标注了不同的...
  • 1、线程工具TreadTestHttp package com; import java.util.concurrent.CountDownLatch; public class TreadTestHttp { public static void main(String[] args) throws InterruptedException { Runn...
  • 例子: 1. 直接new一实例,这样肯定知道用的哪个实例 ...举例子:A接口,A1,A2,A3实现A接口,有一eat方法,A1:吃饭,A2:吃鱼,A3:吃肉 需要得到"吃肉",那么 A a = new A3(); 需要得到...
  • 如果一个接口有2不同的实现, 那么怎么来Autowire一指定的实现? 举例子: 1、接口:ILayer public Interface ILayer{ ...... } 2、实现类:ImageLayerImpl ,实现了ILayer接口。 @Service(...
  • spring boot 接口service有多个实现类

    千次阅读 2019-06-21 15:38:00
    接口.java public interface DeService ...接口实现类1.java @Service("ud")public class DeServiceImplUD implements DeService{ } 接口实现类2.java @Service("ug")public class DeServiceImplUG implement...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 423,850
精华内容 169,540
关键字:

多个类实现同一接口