1. 准备工作
-
接口类
//消息处理接口 public interface Message { /** * 消息处理 */ public void handler(); /** * 消息反馈 */ public void ack(); }
-
常量
public class Constants { public static final String TEXT = "TEXT"; public static final String PICTURE = "PICTURE"; public static final String LOCATION = "LOCATION"; }
-
接口实现类
//文本消息处理 @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由两种不同的实现方式:
-
借助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()); }
运行结果:
处理地理位置消息 处理图片消息 处理文本消息
-
借助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());
}
执行结果:
处理地理位置消息
处理图片消息
处理文本消息