• Spring的工具类,方便在非spring管理环境中获取bean


    场景

    在SpringBoot的后台项目中,如果想要引入并且调用某个bean,可以直接通过注解的方式。

    比如在单元测试中引入某业务的Controller

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class TestBcgl {
    
        @Autowired
        private KqBcglController kqBcglController;

    或者在Controller中引入service

    @RestController
    @RequestMapping("/kqgl/bcgl")
    public class KqBcglController extends BaseController
    {
        @Autowired
        private IKqBcglService kqBcglService;

    但是如果想要再某个工具类中的静态工具方法中调用某个bean的方法,即在非spring管理环境中获取bean的话,应该怎么使用。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    比如现在有一个spring redis的工具类

    @Component
    public class RedisCache

    现在需要在某个工具类DictUtils中,获取不受spring管理中获取上面的RedisCache这个bean

    public class DictUtils
    {
    
        /**
         * 获取字典缓存
         * 
         * @param key 参数键
         * @return dictDatas 字典数据列表
         */
        public static List<SysDictData> getDictCache(String key)
        {
            Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
            if (StringUtils.isNotNull(cacheObj))
            {
                List<SysDictData> DictDatas = StringUtils.cast(cacheObj);
                return DictDatas;
            }
            return null;
        }

    根据上面的SpringUtils.getBean(RedisCache.class)就能获取,那么这个SpringUtils就是封装的

    Spring  工具类

    import org.springframework.aop.framework.AopContext;
    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;
    import org.springframework.stereotype.Component;
    
    /**
     * spring工具类 方便在非spring管理环境中获取bean
     * 
     */
    @Component
    public final class SpringUtils implements BeanFactoryPostProcessor
    {
        /** Spring应用上下文环境 */
        private static ConfigurableListableBeanFactory beanFactory;
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
        {
            SpringUtils.beanFactory = 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
        {
            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);
        }
    
        /**
         * 获取aop代理对象
         * 
         * @param invoker
         * @return
         */
        @SuppressWarnings("unchecked")
        public static <T> T getAopProxy(T invoker)
        {
            return (T) AopContext.currentProxy();
        }
    }
    博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。
  • 相关阅读:
    JavaScript 中的构造函数
    sql链路服务器提示该事务管理器已经禁止了它对远程/网络事务的支持
    Operating System:操作系统启动总结
    Operating System:信号量
    Operating System:管程相关概念
    ACwing(基础)--- 线性DP、区间DP
    ACwing(基础)--- C++STL库
    ACwing(基础)--- 并查集、堆
    ACwing(基础)--- 数组模拟链表、栈、队列
    Vue 学习笔记2 data数据对象
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/13594550.html
Copyright © 2020-2023  润新知