ApplicationContextAware接口的实战应用

简介: ApplicationContextAware接口的实战应用

一 需求

系统要求导入报文数据,通过excel的形式,将数据导入系统,报文分为三种报文。

二 分析

报文分为3种,且报文的格式都是excel,报文可以作为一个抽象,并使用模板方法模式进行导入

三 实践

  1. 新建抽象类IExcelOutYard

     public interface IExcelOutYard {
    
         String messageType();
    
         void loadExcel(Exchange exchange, String fileName, String camelFileParent);
     }
  2. 新建抽象类ExcelOutYardAbstract实现IExcelOutYard

    @Service
    public abstract class ExcelOutYardAbstract implements IExcelOutYard {
    
        private static Logger logger = LogManager.getCurrentClassLogger();
    
        @Override
        public void loadExcel(Exchange exchange, String fileName,String camelFileParent) {
            Object body = exchange.getIn().getBody();
            GenericFile<File> genericFile = (GenericFile<File>) body;
            File file = genericFile.getFile();
            this.analysis(file, fileName,camelFileParent);
        }
    
        private void analysis(File file, String fileName,String camelFileParent) {
            Workbook workbook = getWorkbook(file);
            Sheet sheet = workbook.getSheetAt(0);
            Set<String> messages = Sets.newConcurrentHashSet();
            // 1.校验数据
            validateMessage(sheet, messages, fileName);
            if (ObjectUtils.isNotEmpty(messages)) {
                logger.error("校验不通过,原因[{}]", Joiner.on(";").join(messages));
            }
            // 2 组装对象
            List<Booking> bookings = contrustData(sheet, fileName,camelFileParent);
            // 3 插入数据
            saveAndUpdateData(bookings);
        }
            public List<Booking> contrustData(Sheet sheet, String fileName,String camelFileParent) {
                return null;
            }

            public void saveAndUpdateData(List<Booking> bookings) {
            }

            public void validateMessage(Sheet sheet, Set<String> messages, String fileName) {
            }

            private Workbook getWorkbook(File file) {
             -----
            }


            }
            ```
    3. 新建`ExcelOutYardAccessGate`,`ExcelOutYardEmpty`,`ExcelOutYardSo`继承抽象类`ExcelOutYardAbstract`

        ```
        @Service
        public class ExcelOutYardSo extends ExcelOutYardAbstract {


            @Override
            public String messageType() {
                return ExcelOutYardEnum.OUT_YARD_SO.name();
            }
        ```
    
    4. 新建`ExcelOutYardManager` 实现`ApplicationContextAware`接口
    
        ```
        public class ExcelOutYardManager implements ApplicationContextAware {

            Map<String,IExcelOutYard> excelOutYardMap;

            private Map<String, IExcelOutYard> getExcelOutYard() {
                if (excelOutYardMap == null) {
                    excelOutYardMap = new HashMap<String, IExcelOutYard>();
                }
                return excelOutYardMap;
            }

            public IExcelOutYard getImpleService(String messageType){
                return excelOutYardMap.get(messageType);
            }

            @Override
            public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
                Map<String, IExcelOutYard> beansOfType = applicationContext.getBeansOfType(IExcelOutYard.class);
                this.getExcelOutYard();
                for (IExcelOutYard iExcelOutYard:beansOfType.values()) {
                    excelOutYardMap.put(iExcelOutYard.messageType(),iExcelOutYard);
                }
            }
        }
        ```

5.调用

 String messageType = (String) exchange.getProperty("messageType");
 excelOutYardManager.getImpleService(messageType).loadExcel(exchange, fileName,camelFileParent);

三 结语

ApplicationContextAware接口在我前面的文章中,有所介绍,实现ApplicationContextAware接口后我们可以获得Bean容器中的所有bean,然后我们通过抽象类和他的实现,进行类型的映射,最终调用的时候,只需要传入类型码就可以了,从而实现了一个符合单一职责和开闭原则的设计。

相关文章
|
5天前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——接口(BaseDao)
使用JDBCTemplate实现与Spring结合,方法公用 ——接口(BaseDao)
10 0
|
9月前
|
Java Spring 容器
深入理解Spring源码之IOC 扩展原理BeanFactoryPostProcessor和事件监听ApplicationListener
深入理解Spring源码之IOC 扩展原理BeanFactoryPostProcessor和事件监听ApplicationListener
|
10月前
|
XML JSON Java
介绍 Spring 体系、Bean 生命周期剖析以及核心接口 BeanFactory、BeanFactoryPostProcessor、BeanPostProcessor
介绍 Spring 体系、Bean 生命周期剖析以及核心接口 BeanFactory、BeanFactoryPostProcessor、BeanPostProcessor
259 0
|
11月前
|
Java Spring 容器
深入理解Spring IOC之扩展篇(三)、InitializingBean、@PostConstruct、SmartInitializingSingleton
深入理解Spring IOC之扩展篇(三)、InitializingBean、@PostConstruct、SmartInitializingSingleton
149 0
|
Java Spring
Spring - InitializingBean扩展接口
InitializingBean扩展接口
122 0
Spring - InitializingBean扩展接口
|
Java Spring 容器
Spring - BeanFactoryPostProcessor 扩展接口
BeanFactoryPostProcessor 扩展接口
99 0
Spring - BeanFactoryPostProcessor 扩展接口
|
容器
ApplicationContextAware接口的实战应用
系统要求导入报文数据,通过excel的形式,将数据导入系统,报文分为三种报文。
|
Java 容器 Spring
CommandLineRunner与ApplicationRunner接口的使用及源码解析
CommandLineRunner与ApplicationRunner接口的使用及源码解析
CommandLineRunner与ApplicationRunner接口的使用及源码解析
|
Java Spring 容器
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
251 0
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
|
XML SpringCloudAlibaba 前端开发
spring InitializingBean 接口都不知道,源码还是缓缓吧
spring InitializingBean 接口都不知道,源码还是缓缓吧
173 0
spring InitializingBean 接口都不知道,源码还是缓缓吧