content: package com.xiliu.common.utils;
  
  import org.springframework.aop.framework.AopContext;
  import org.springframework.beans.BeansException;
  import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  import org.springframework.context.ApplicationContext;
  import org.springframework.context.ApplicationContextAware;
  import org.springframework.stereotype.Component;
  
  /**
   * @author xiliu
   * @description spring工具类 方便在非spring管理环境中获取bean
   * @date 2022/7/28
   */
  @Component
  public class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware {
  
      /** Spring应用上下文环境 */
      private static ConfigurableListableBeanFactory beanFactory;
  
      private static ApplicationContext applicationContext;
  
      @Override
      public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
          SpringUtils.beanFactory = beanFactory;
      }
  
      @Override
      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
          SpringUtils.applicationContext = applicationContext;
      }
  
      /**
       * 获取类型为requiredType的对象
       * @param clz
       * @return
       * @throws BeansException
       */
      public static <T> T getBean(Class<T> clz) throws BeansException {
          T result = (T) beanFactory.getBean(clz);
          return result;
      }
  
      /**
       * 获取对象
       * @param name
       * @return Object 一个以所给名字注册的bean的实例
       * @throws BeansException
       */
      @SuppressWarnings("unchecked")
      public static <T> T getBean(String name) throws BeansException {
          return (T) beanFactory.getBean(name);
      }
  
      /**
       * 获取aop代理对象
       *
       * @param invoker
       * @return
       */
      @SuppressWarnings("unchecked")
      public static <T> T getAopProxy(T invoker) {
          return (T) AopContext.currentProxy();
      }
  }
  