SpringBoot 获取Spring容器中的bean

作者: 小疯子 分类: Spring Boot 发布时间: 2019-03-29 22:24

一、 缘由

编写了一个和用户相关的工具类,其中某个方法需要调用spring提供的某个bean对象;

摘自<[十]SpringBoot 之 普通类获取Spring容器中的bean>: 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用spring提供的其他对象或者说有一些不需要交给spring管理,但是需要用到spring里的一些对象。

自己理解一下上面的话,就是说如果在一个不被spring容器管理的类A中调用某个在spring容器中的类对象B,我需要提供一个工具类来实现这个功能,在类A中调用这个工具类就能获取到想要的在spring容器中的bean对象;

二、工具类SpringUtils编写

  1. 基础内容编写

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component(value = "com.ddmall.api20.shop.util.UserUtils")
public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        UserUtils.context = applicationContext;
    }

}

也可以继承BeanFactoryPostProcessor ,定义ConfigurableListableBeanFactory 变量如下所示:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public final class SpringUtils implements BeanFactoryPostProcessor {

    private static ConfigurableListableBeanFactory beanFactory; // Spring应用上下文环境

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        SpringUtils.beanFactory = beanFactory;
    }
}

     2. 具体编写获取bean的方法

package com.xiaofeng.pro.common.utils;


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

@Component
public final class SpringUtils implements BeanFactoryPostProcessor {

    private static ConfigurableListableBeanFactory beanFactory; 

    /**
     * 获取对象
     *
     * @param name
     * @return Object 一个以所给名字注册的bean的实例
     * @throws org.springframework.beans.BeansException
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 获取类型为requiredType的对象
     *
     * @param clz
     * @return
     * @throws org.springframework.beans.BeansException
     */
    public static <T> T getBean(Class<T> clz) throws BeansException {
        @SuppressWarnings("unchecked")
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
     *
     * @param name
     * @return boolean
     */
    public static boolean containsBean(String name) {
        return beanFactory.containsBean(name);
    }

    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
     *
     * @param name
     * @return boolean
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.isSingleton(name);
    }

    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getType(name);
    }

    /**
     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
     *
     * @param name
     * @return
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getAliases(name);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        SpringUtils.beanFactory = beanFactory;
    }

}

注:继承ApplicationContextAware的话方法和上面是一样的,因为不管是ApplicationContextAware还是BeanFactoryPostProcessor都继承了BeanFactory,其中的getBean都是来自于BeanFactory;

三、工具类的使用

  1. 向spring容器中注入一个bean

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import me.shijunjie.entity.Demo2;
    
    @Configuration
    public class BeanConfig {
        @Bean(name="testDemo")
        public Demo2 generateDemo() {
            Demo2 demo = new Demo2();
            demo.setId(12345);
            demo.setName("test");
            return demo;
        }
    }

    如果在SpringUtils的顶部不加@Component,还可以在这个config中来引入,在@Configuration下加一行如下:如果都不加的话运行时会报SpringUtils为空的异常

    @Configuration
    @Import(SpringUtils.class)
    public class BeanConfig {
  2. 编写测试Controller,并使用工具类SpringUtils中获取这个bean

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import me.shijunjie.util.SpringUtils;
    
    @RestController
    @RequestMapping("/application")
    public class TestApplicationController {
        
        @RequestMapping("/test1")
        public Object testSpringUtil1() {
            return SpringUtils.getBean("testDemo");
        }
        
    }

四、参考链接

[十]SpringBoot 之 普通类获取Spring容器中的bean: https://www.cnblogs.com/s648667069/p/6489557.html

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注