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");
        }
    
    }

    启动项目测试

  • 相关阅读:
    sql执行的顺序
    $(obj).index(this) 与 $(this).index()的区别
    java取得百分比
    取得input的特殊值
    清除select的边框和三角形
    在jsp页面中获取列表长度
    mysql mybatis 批量更新和新增
    oracle mybatis 批量更新和新增
    jstl if else 判断
    判断radio,select,checkbox是否选中的方法
  • 原文地址:https://www.cnblogs.com/dbutil/p/10812181.html
Copyright © 2011-2022 走看看