zoukankan      html  css  js  c++  java
  • 一个接口多个实现类

    一、以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext。适用于根据数据库的配置取出对应定时任务的实现类
    package com.wy.SpringBean;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    import org.springframework.util.Assert;
    
    /**
     * @description:以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext,
     * 适用于根据数据库的配置取出对应定时任务的实现类
     **/
    
    @Component
    public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
    
        private static ApplicationContext applicationContext = null;
    
        private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);
    
        /**
         * 取得存储在静态变量中的ApplicationContext.
         */
        public static ApplicationContext getApplicationContext() {
            assertContextInjected();
            return applicationContext;
        }
    
        /**
         * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
         */
        @SuppressWarnings("unchecked")
        public static <T> T getBean(String name) {
            assertContextInjected();
            return (T) applicationContext.getBean(name);
        }
    
        /**
         * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
         */
        public static <T> T getBean(Class<T> requiredType) {
            assertContextInjected();
            return applicationContext.getBean(requiredType);
        }
    
        /**
         * 清除SpringContextHolder中的ApplicationContext为Null.
         */
        public static void clearHolder() {
            logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
            applicationContext = null;
        }
    
        /**
         * 实现ApplicationContextAware接口, 注入Context到静态变量中.
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            logger.debug("注入ApplicationContext到SpringContextHolder:" + applicationContext);
    
            if (SpringContextHolder.applicationContext != null) {
                logger.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:"
                        + SpringContextHolder.applicationContext);
            }
    
            SpringContextHolder.applicationContext = applicationContext;
        }
    
        /**
         * 实现DisposableBean接口, 在Context关闭时清理静态变量.
         */
        @Override
        public void destroy() throws Exception {
            SpringContextHolder.clearHolder();
        }
    
        /**
         * 检查ApplicationContext不为空.
         */
        private static void assertContextInjected() {
            Assert.state(applicationContext != null,
                    "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
        }
    
    
    }

    二、定义接口

    public interface TestInterface {
    
        void testInter(String str);
    }

    三、定义两个个实现类

    @Service("testImp01")
    public class testImp01 implements TestInterface{
        @Override
        public void testInter(String str) {
            System.out.println("testImp01:"+str);
        }
    }
    @Service("testImp02")
    public class testImp02 implements TestInterface{
        @Override
        public void testInter(String str) {
            System.out.println("testImp02:"+str);
        }
    }

    四、定义controller

    @RestController
    public class TestController {
    
    
    
        @RequestMapping("test01")
        public void test01() {
            TestInterface testInterface = SpringContextHolder.getBean("testImp01");
            testInterface.testInter("01");
        }
        @RequestMapping("test02")
        public void test02() {
            TestInterface testInterface = SpringContextHolder.getBean("testImp02");
            testInterface.testInter("02");
        }
    
    }

    启动项目测试

  • 相关阅读:
    八十四、SAP中的ALV创建之三,创建ALV表格
    八十三、SAP中的ALV创建之二,ALV相关的类型池定义
    八十二、SAP中的ALV创建之一,新建一个程序
    八十一、SAP中的ALV的简介(ABAP List Viewer)
    八十、SAP中数据库操作之 (FOR ALL ENTRIES IN )用法,比较难明白
    七十九、SAP中数据库操作之更新数据,UPDATE的用法
    七十八、SAP中数据库操作之查询条数限制
    七十七、SAP中数据库操作之多表联合查询
    七十六、SAP中数据库的查询用法之 COUNT(总数),SUM(求和),AVG(求平均),GROUP BY(分组)
    七十五、SAP中数据库的使用SQL
  • 原文地址:https://www.cnblogs.com/dbutil/p/10812181.html
Copyright © 2011-2022 走看看