SpringBoot項目=普通類中注入bean問題解決
1.直接在普通類中使用@Autowired注入bean,會導緻注入的對象為null。這是因為普通類無法通過@Autowired注入bean,使用@Autowired注入bean要求這個類也注入到spring容器中,交給容器管理。
如下圖所示:
檢視結果,顯示對象是null
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);