Spring ApplicationContextAware接口
2016-03-15 17:23
393 查看
有一个需求,导入Excel文件对文件进行解析(多种解析方式),用户在界面上可以下拉选择解析的方式。解决办法首先想到应该就是根据用户的选择判断调用哪个解析方法。因为这些解析方式重用可能性比较大,我们用接口的方式来实现它。
接口:
实现类A:
实现类B:
Service:
测试类:
输出:
用户选择使用A方法解析Excel !
{way_b=选择B类解析, way_a=选择A类解析}
Service中提供了getMapSelect()方法用于返回一个Map用于用户在界面直接选择解析方式。如果需要增加解析方式,只需要实现接口即可,无需更改其它代码。界面下拉项目会根据实现类的个数自动显示。不好的地方就是需要通过(ApplicationContext 获取接口的实现的实例
会有入侵式设计。
接口:
public interface ExcelImport { /** * 返回实现类标识 * * @return */ public String getId(); /** * 返回实现类名称可用于界面下拉选择 * * @return */ public String getName(); /** * 解析Excel */ public void analyze(); }
实现类A:
@Service public class ExcelImportAImpl implements ExcelImport { private static final String id = "way_a"; private static final String name = "选择A类解析"; @Override public String getId() { return id; } @Override public String getName() { return name; } @Override public void analyze() { System.out.println("用户选择使用A方法解析Excel !"); } }
实现类B:
@Service public class ExcelImportBImpl implements ExcelImport { private static final String id = "way_b"; private static final String name = "选择B类解析"; @Override public String getId() { return id; } @Override public String getName() { return name; } @Override public void analyze() { System.out.println("用户选择使用B方法解析Excel !"); } }
Service:
@Service("excelImportService") public class ExcelImportService implements ApplicationContextAware { private ApplicationContext applicationContext; //注意线程安全问题(这边不会多次设置值不做处理了) private Map<String, ExcelImport> map = new HashMap<String, ExcelImport>(); //注意线程安全问题(这边不会多次设置值不做处理了) private Map<String, String> mapForSelect = new HashMap<String, String>(); private List<String> list = new ArrayList<String>(); /** * 根据用户选择返回对应的解析实现类 * * @param key 实现类的标识 * @return */ public ExcelImport getExcelImportEntity(String key) { return this.map.get(key); } /** * 返回用于界面选择 * * @return */ public Map<String, String> getMapSelect() { return mapForSelect; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; for (ExcelImport entity : this.applicationContext.getBeansOfType(ExcelImport.class).values()) { map.put(entity.getId(), entity); mapForSelect.put(entity.getId(), entity.getName()); } } }
测试类:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:beans.xml"}) public class TestImport { @Autowired private ExcelImportService excelImportService; @Test public void test() { excelImportService.getExcelImportEntity("way_a").analyze(); System.out.println(excelImportService.getMapSelect()); } }
输出:
用户选择使用A方法解析Excel !
{way_b=选择B类解析, way_a=选择A类解析}
Service中提供了getMapSelect()方法用于返回一个Map用于用户在界面直接选择解析方式。如果需要增加解析方式,只需要实现接口即可,无需更改其它代码。界面下拉项目会根据实现类的个数自动显示。不好的地方就是需要通过(ApplicationContext 获取接口的实现的实例
会有入侵式设计。
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- 详解Java的Spring框架中的事务管理方式
- 解析Java的Spring框架的BeanPostProcessor发布处理器
- Java开发框架spring实现自定义缓存标签
- java基本教程之线程休眠 java多线程教程
- JSP开发中在spring mvc项目中实现登录账号单浏览器登录
- spring boot实战之内嵌容器tomcat配置