zoukankan      html  css  js  c++  java
  • 手动注入bean到spring容器

    ApplicationContext applicationContext = SpringContextUtils.getApplicationContext();
    //将applicationContext转换为ConfigurableApplicationContext
    ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
    
    // 获取bean工厂并转换为DefaultListableBeanFactory
    DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
    
    this.defaultListableBeanFactory = defaultListableBeanFactory;
    
    String[] beanNamesForType = defaultListableBeanFactory.getBeanNamesForType(PayClient.class);
    
    System.out.println("beanNamesForType:" + Arrays.toString(beanNamesForType));
    
    // defaultListableBeanFactory.removeBeanDefinition("com.example.zuul.feign.PayClient");
    defaultListableBeanFactory.removeBeanDefinition(beanNamesForType[0]);
    
    // 通过BeanDefinitionBuilder创建bean定义
    BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(PayClient.class);
    
    // 设置属性userService,此属性引用已经定义的bean:userService,这里userService已经被spring容器管理了.
    // beanDefinitionBuilder.addPropertyReference("payClient", "payClient");
    
    // 注册bean
    defaultListableBeanFactory.registerBeanDefinition("com.example.zuul.feign.PayClient", beanDefinitionBuilder.getRawBeanDefinition());
    
    Object bean = SpringContextUtils.getBean(PayClient.class);
    
    
    package com.example.zuul;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    /**
     * 获取ApplicationContext和Object的工具类
     */
    @Component
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class SpringContextUtils implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext;
    
        /**
         * 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
         */
        public void setApplicationContext(ApplicationContext applicationContext) {
    
            SpringContextUtils.applicationContext = applicationContext; // NOSONAR
        }
    
        /**
         * 取得存储在静态变量中的ApplicationContext.
         */
        public static ApplicationContext getApplicationContext() {
            checkApplicationContext();
            return applicationContext;
        }
    
        private static void checkApplicationContext() {
            if (applicationContext == null) {
                throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
            }
        }
    
        /**
         * 获取bean
         *
         * @param name bean的id
         * @param <T>
         * @return
         */
        public static <T> T getBean(String name) {
            return (T) applicationContext.getBean(name);
        }
    
        //通过类型获取上下文中的bean
        public static Object getBean(Class<?> requiredType) {
            return applicationContext.getBean(requiredType);
        }
    
    }
    
  • 相关阅读:
    edge.js架起node.js和.net互操作桥梁
    Swift学习:闭包(Closures)
    swift UIAlertController教程
    linux配置IP的方法
    centos 6.5安装vncserver 并开启远程桌面
    CSS中各种居中方法
    jquery中的index方法和eq方法
    line-height的用法(一)
    第八章—BOM(一)
    第四章—变量,作用域和内存问题(一)
  • 原文地址:https://www.cnblogs.com/starmoon1994/p/9966739.html
Copyright © 2011-2022 走看看