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,然后我们通过抽象类和他的实现,进行类型的映射,最终调用的时候,只需要传入类型码就可以了,从而实现了一个符合单一职责和开闭原则的设计。

相关文章
|
XML JSON Java
介绍 Spring 体系、Bean 生命周期剖析以及核心接口 BeanFactory、BeanFactoryPostProcessor、BeanPostProcessor
介绍 Spring 体系、Bean 生命周期剖析以及核心接口 BeanFactory、BeanFactoryPostProcessor、BeanPostProcessor
312 0
|
Java Spring 容器
深入理解Spring IOC之扩展篇(三)、InitializingBean、@PostConstruct、SmartInitializingSingleton
深入理解Spring IOC之扩展篇(三)、InitializingBean、@PostConstruct、SmartInitializingSingleton
259 0
|
NoSQL 安全 Java
踩坑篇之WebSocket实现类中无法使用@Autowired注入对象
踩坑篇之WebSocket实现类中无法使用@Autowired注入对象
209 0
|
Java Spring
Spring - InitializingBean扩展接口
InitializingBean扩展接口
152 0
Spring - InitializingBean扩展接口
|
Java 容器 Spring
CommandLineRunner与ApplicationRunner接口的使用及源码解析
CommandLineRunner与ApplicationRunner接口的使用及源码解析
CommandLineRunner与ApplicationRunner接口的使用及源码解析
|
容器
ApplicationContextAware接口的实战应用
系统要求导入报文数据,通过excel的形式,将数据导入系统,报文分为三种报文。
|
Java Spring 容器
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
301 0
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
|
XML SpringCloudAlibaba 前端开发
spring InitializingBean 接口都不知道,源码还是缓缓吧
spring InitializingBean 接口都不知道,源码还是缓缓吧
197 0
spring InitializingBean 接口都不知道,源码还是缓缓吧
|
消息中间件 运维 Java
Spring源码分析(六)FactoryBean 接口解析
说道FactoryBean,不少人会拿它跟BeanFactory作比较,但是实际上他们没有多大关系;我们简单介绍一下两者 Part1一、BeanFactory和FactoryBean区别 1BeanFactory BeanFactory:这就是一个Factory,是一个IOC容器或者叫对象工厂,它里面存着很多的bean。例如默认的实现方式DefaultListableBeanFactory;我们把IOC容器可以比作一个水桶,IOC容器里面的所有bean就是装的水; ##FactoryBean
Spring源码分析(六)FactoryBean 接口解析
|
Java 程序员 网络安全
spring4.1.8扩展实战之七:控制bean(BeanPostProcessor接口)
实战在容器初始化的时候对bean实例做设置
146 0
spring4.1.8扩展实战之七:控制bean(BeanPostProcessor接口)