天天看點

SpringBoot項目中在普通類中注入bean的問題

SpringBoot項目=普通類中注入bean問題解決

1.直接在普通類中使用@Autowired注入bean,會導緻注入的對象為null。這是因為普通類無法通過@Autowired注入bean,使用@Autowired注入bean要求這個類也注入到spring容器中,交給容器管理。

如下圖所示:

SpringBoot項目中在普通類中注入bean的問題

檢視結果,顯示對象是null

SpringBoot項目中在普通類中注入bean的問題

2.具體解決方法如下:

建一個spring工具類

/**
 * @author lrx
 * @description: TODO
 * @date 2022/10/19 16:54
 */
@Component
public class SpringUtilsAuTo implements BeanFactoryPostProcessor {
    /**
     * Spring應用上下文環境
     */
    private static ConfigurableListableBeanFactory beanFactory;

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

    /**
     * 擷取對象
     *
     * @param name
     * @return Object 一個以所給名字注冊的bean的執行個體
     * @throws BeansException
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 擷取類型為requiredType的對象
     *
     * @param clz
     * @return
     * @throws 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 NoSuchBeanDefinitionException
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.isSingleton(name);
    }

    /**
     * @param name
     * @return Class 注冊對象的類型
     * @throws NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getType(name);
    }

    /**
     * 如果給定的bean名字在bean定義中有别名,則傳回這些别名
     *
     * @param name
     * @return
     * @throws 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();
    }
}      

在需要調用的類裡面具體寫法

private static SafetyCameraService safetyCameraService = SpringUtilsAuTo.getBean(SafetyCameraService.class);
    private static SafetyCameraEventTypeService safetyCameraEventTypeService = SpringUtilsAuTo.getBean(SafetyCameraEventTypeService.class);