【接口多实现类的动态调用】

1. 准备工作

  1. 接口类

    //消息处理接口
    public interface Message {
        /**
         * 消息处理
         */
        public void handler();
    
        /**
         * 消息反馈
         */
        public void ack();
    }
    
  2. 常量

    public class Constants {
        public static final String TEXT = "TEXT";
        public static final String PICTURE = "PICTURE";
        public static final String LOCATION = "LOCATION";
    }
    
  3. 接口实现类

    //文本消息处理
    @Service(Constants.TEXT)
    public class TextMessage implements Message {
    
        @Override
        public void handler() {
            System.out.println("处理文本消息");
        }
    
        @Override
        public void ack() {
            System.out.println("文本消息处理完成反馈");
        }
    }
    
    //图片消息处理
    @Service(Constants.PICTURE)
    public class PictureMessage implements Message {
    
        @Override
        public void handler() {
            System.out.println("处理图片消息");
        }
    
        @Override
        public void ack() {
            System.out.println("图片消息处理完成反馈");
        }
    }
    
    //地理位置消息处理
    @Service(Constants.LOCATION)
    public class LocationMessage implements Message {
    
        @Override
        public void handler() {
            System.out.println("处理地理位置消息");
    
        }
    
        @Override
        public void ack() {
            System.out.println("地理位置消息处理完成反馈");
        }
    }
    

2. 使用自动注入

/**
 * 使用自动注入的方式
 */
@SpringBootTest
class DemoApplicationTests{
    
    /**
     * 自动注入方式的主要代码
     */
    @Autowired
    private Map<String,Message> messageMap;
    
    @Test
    void contextLoads(){
        massageMap.forEach(key,value) -> value.handler());
    }
}

运行结果:

处理地理位置消息
处理图片消息
处理文本消息

3. 借助ApplicationContext

借助ApplicationContext由两种不同的实现方式:

  1. 借助ApplicationContext中的getBeansOfType()方法

    方法签名:

     <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
    

    借助该方法能返回一个接口的全部实现类(前提是所有实现类都必须由Spring IoC容器管理)

    @Test
    void contextLoads(){
        Map<String,Message> beanOfType = context.getBeanOfType(Message.class);
        beanOfType.forEach((key.value) -> value.handler());
    }
    

    运行结果:

    处理地理位置消息
    处理图片消息
    处理文本消息
    
  2. 借助ApplicationContext中的getBean()方法

    //工具类
    public class ApplicationContextUtil extends ApplicationObjectSupport{
        public <T> T getBean(String name){
            retuurn (T) super.getApplicationCpntext().getBean(name);
        }
    }
    
    @Test
    void contextLoads(){
        TextMessage bean = applicationContextUtil.getBean(Constants.TEXT);
        bean.handler();
        LocationMessage bean1 = applicationContextUtil.getBean(Constants.LOCATION);
        bean1.handler();
        PictureMessage bean2 = applicationContextUtil.getBean(Constants.PICTURE);
        bean2.handler();
    }
    

    执行结果:

    处理文本消息
    处理地理位置消息
    处理图片消息
    

4. 借助@PostConstruct

@PostConstruct注解的作用,是在spring生成对象之后,做一些初始化的操作。被注解的方法会在依赖注入完成后被自动执行。

@Component
public class Test{
    
    public static Map<String,Message> messageMap = new HashMap<>();
    
    @PostConstruct
    public void init(){
        messageMap.put(Constants.TEXT, new TextMessage());
        messageMap.put(Constants.PICTURE, new PictureMessage());
        messageMap.put(Constants.LOCATION, new LocationMessage());
    }
}
@Test
void contextLoads4(){
   Test.messageMap1.forEach((key, value) -> value.handler());
}

执行结果:

处理地理位置消息
处理图片消息
处理文本消息

5. 实现InitializingBean

InitializingBean接口的作用和@PostConstruct类似,是在spring生成对象之后,做一些初始化的操作

@Component
public class Test2 implements InitializingBean {
    
    public static Map<String, Message> messageMap2 = new HashMap<>();

    @Override
    public void afterPropertiesSet() throws Exception {
        messageMap2.put(Constants.TEXT, new TextMessage());
        messageMap2.put(Constants.PICTURE, new PictureMessage());
        messageMap2.put(Constants.LOCATION, new LocationMessage());
    }
}
@Test
void contextLoads5(){
    Test2.messageMap2.forEach((key, value) -> value.handler());
}

执行结果:

处理地理位置消息
处理图片消息
处理文本消息

6. 借助静态代码块

public class Test3 {
    public static Map<String, Message> messageMap3 = new HashMap<>();

    static {
        messageMap3.put(Constants.TEXT, new TextMessage());
        messageMap3.put(Constants.PICTURE, new PictureMessage());
        messageMap3.put(Constants.LOCATION, new LocationMessage());
    }
}
@Test
void contextLoads6(){
    Test3.messageMap3.forEach((key, value) -> value.handler());
}

执行结果:

处理地理位置消息
处理图片消息
处理文本消息
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值