一, 以静态变量保存 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");
- }
- }
启动项目测试
来源: http://www.bubuko.com/infodetail-3047143.html