spring接口多实现怎么注入的

fiy 其他 46

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring中,当一个接口存在多个实现类时,可以通过以下几种方式注入到其他类中:

    1. @Qualifier注解配合@Autowired注入:@Qualifier注解可以指定注入哪个具体的实现类。假设一个接口有两个实现类,可以在注入时使用@Qualifier指定要注入的实现类的bean名称。
    public interface ExampleInterface {
        void method();
    }
    
    @Service("exampleImpl1")
    public class ExampleImpl1 implements ExampleInterface {
        // 实现
    }
    
    @Service("exampleImpl2")
    public class ExampleImpl2 implements ExampleInterface {
        // 实现
    }
    
    @Service
    public class ExampleService {
    
       @Autowired
       @Qualifier("exampleImpl1")
       private ExampleInterface exampleInterface;
    
       // ...
    }
    
    1. @Primary注解:使用@Primary注解可以指定某个实现类为首选的注入实现类。
    public interface ExampleInterface {
        void method();
    }
    
    @Service
    @Primary
    public class ExampleImpl1 implements ExampleInterface {
        // 实现
    }
    
    @Service
    public class ExampleImpl2 implements ExampleInterface {
        // 实现
    }
    
    @Service
    public class ExampleService {
    
       @Autowired
       private ExampleInterface exampleInterface;
    
       // ...
    }
    
    1. 使用@Resource注解进行注入:@Resource注解默认按照属性名称进行匹配,如果属性名称与bean名称一致,则可以直接注入。
    public interface ExampleInterface {
        void method();
    }
    
    @Service("exampleImpl1")
    public class ExampleImpl1 implements ExampleInterface {
        // 实现
    }
    
    @Service("exampleImpl2")
    public class ExampleImpl2 implements ExampleInterface {
        // 实现
    }
    
    @Service
    public class ExampleService {
    
       @Resource
       private ExampleInterface exampleImpl1;
    
       // ...
    }
    

    需要注意的是,以上三种方式都可以用于注入多个实现类,但是如果只有一个实现类时,直接使用@Autowired注解进行注入即可。另外,注入时也可以使用构造器注入或者setter方法注入。根据具体场景和需求选择合适的方式进行注入。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在使用Spring框架进行接口多实现的注入时,可以通过以下几种方式来实现:

    1. @Autowired注解:通过@Autowired注解可以直接注入接口的实现类。在多个实现类中,可以使用@Qualifier注解指定具体的实现类来注入。
    public interface MyInterface {
        void method();
    }
    
    @Service
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Service
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Controller
    public class MyController {
        @Autowired
        @Qualifier("myInterfaceImpl1") // 指定注入的实现类
        private MyInterface myInterface;
    
        // 使用MyInterface对象
    }
    
    1. @Resource注解:通过@Resource注解也可以实现接口的多实现注入。@Resource注解默认按照名称进行匹配注入,如果有多个实现类的名称一致,可以通过name属性指定具体的实现类。
    public interface MyInterface {
        void method();
    }
    
    @Service("myInterfaceImpl1")
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Service("myInterfaceImpl2")
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Controller
    public class MyController {
        @Resource(name = "myInterfaceImpl1") // 指定注入的实现类
        private MyInterface myInterface;
    
        // 使用MyInterface对象
    }
    
    1. 使用@Primary注解:通过在实现类上使用@Primary注解,可以指定其中一个实现类为优先注入的实现类。
    public interface MyInterface {
        void method();
    }
    
    @Service
    @Primary // 设置为优先注入的实现类
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Service
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Controller
    public class MyController {
        @Autowired
        private MyInterface myInterface;
    
        // 使用MyInterface对象,默认注入MyInterfaceImpl1
    }
    
    1. 使用@Conditional注解:通过在配置类或者@Bean方法上使用@Conditional注解,根据条件选择需要注入的实现类。
    @Configuration
    public class MyConfig {
        @Bean
        @Conditional(ConditionA.class) // 满足条件A时,注入MyInterfaceImpl1
        public MyInterface myInterfaceImpl1() {
            return new MyInterfaceImpl1();
        }
    
        @Bean
        @Conditional(ConditionB.class) // 满足条件B时,注入MyInterfaceImpl2
        public MyInterface myInterfaceImpl2() {
            return new MyInterfaceImpl2();
        }
    }
    
    1. 使用@Qualifier注解:当有多个实现类时,通过@Qualifier注解结合@Autowired注解或者@Reousrce注解来指定具体的实现类。
    public interface MyInterface {
        void method();
    }
    
    @Service
    @Qualifier("myInterfaceImpl1") // 指定名称
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Service
    @Qualifier("myInterfaceImpl2") // 指定名称
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void method() {
            // 实现逻辑
        }
    }
    
    @Controller
    public class MyController {
        @Autowired
        @Qualifier("myInterfaceImpl1") // 指定注入的实现类
        private MyInterface myInterface;
    
        // 使用MyInterface对象
    }
    

    以上是几种常用的方式来实现接口的多实现注入。通过合理的选择和使用,可以实现对接口多实现注入的灵活控制。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring框架中,一个接口可以有多个实现类,那么在进行注入时,需要使用特定的方式来指定注入的实现类。下面介绍几种常用的方法来实现接口多实现的注入。

    方式一:使用@Qualifier注解

    可以使用@Qualifier注解来指定具体要注入的实现类。在实现类上使用@Qualifier注解进行标注,然后在注入的地方使用@Autowired注解结合@Qualifier注解来指定具体要注入的实现类。

    public interface MyInterface {
        void doSomething();
    }
    
    @Component("impl1")
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void doSomething() {
            // ...
        }
    }
    
    @Component("impl2")
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void doSomething() {
            // ...
        }
    }
    
    @Service
    public class MyService {
        @Autowired
        @Qualifier("impl1")
        private MyInterface myInterface;
        
        // ...
    }
    

    方式二:使用@Primary注解

    可以在多个实现类中使用@Primary注解来标记一个主要的实现类,然后在注入的地方直接使用@Autowired注解注入即可。

    public interface MyInterface {
        void doSomething();
    }
    
    @Component
    @Primary
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void doSomething() {
            // ...
        }
    }
    
    @Component
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void doSomething() {
            // ...
        }
    }
    
    @Service
    public class MyService {
        @Autowired
        private MyInterface myInterface;
        
        // ...
    }
    

    方式三:使用注入列表

    可以使用@Autowired注解结合List类型来注入一个接口的所有实现类。Spring会自动将实现类添加到List中。

    public interface MyInterface {
        void doSomething();
    }
    
    @Component
    public class MyInterfaceImpl1 implements MyInterface {
        @Override
        public void doSomething() {
            // ...
        }
    }
    
    @Component
    public class MyInterfaceImpl2 implements MyInterface {
        @Override
        public void doSomething() {
            // ...
        }
    }
    
    @Service
    public class MyService {
        @Autowired
        private List<MyInterface> myInterfaces;
        
        // ...
    }
    

    以上就是注入接口多实现的几种常用方法,根据具体的需求选择合适的方式进行注入即可。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部