項目中我遇到同樣的問題 特記載一下
有兩種方式
一、
該類使用@Component注解
添加一個本類類型的靜態字段
創建一個初始化方法,貼上@PostConstruct 標簽,用於注入bean
創建方法調用mapper或service接口
最后直接在普通類中調用即可
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。
被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且只會被服務器調用一次,類似於Serclet的inti()方法。被@PostConstruct修飾的方法會在構造函數之后,init()方法之前運行。
個人理解就是mapper 裝載失敗 重點init()方法中轉了一次
@Component public class TestUtil { @Autowired private DoctorInformationMapper doctorInformationMapper; public static TestUtil testUtil; @PostConstruct public void init() { testUtil = this; testUtil.doctorInformationMapper = this.doctorInformationMapper; } //調用 public static int getOpenId() { int count = testUtil.doctorInformationMapper.count("12313"); return count; } }
二。通過spring 容器去拿
2.1首先打印出Spring容器所有的Bean名稱
@Component public class ApplicationContextBean implements ApplicationContextAware, InitializingBean { public static ApplicationContext applicationContext; /** * 獲取 ApplicationContext * * @param applicationContext * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextBean.applicationContext = applicationContext; } /** * 打印IOC容器中所有的Bean名稱 * * @throws Exception */ @Override public void afterPropertiesSet() throws Exception { String[] names = applicationContext.getBeanDefinitionNames(); for (String name : names) { System.out.println(">>>>>>" + name); } System.out.println("------\nBean 總計:" + applicationContext.getBeanDefinitionCount()); } }
不用調用測試,項目啟動就會在后台打印出來
2.2開始寫獲取bean工具類
@Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; public SpringUtil() { } public void setApplicationContext(ApplicationContext arg0) throws BeansException { if (applicationContext == null) { applicationContext = arg0; } } public static ApplicationContext getApplicationContext() { return applicationContext; } public static void setAppCtx(ApplicationContext webAppCtx) { if (webAppCtx != null) { applicationContext = webAppCtx; } } /** * 拿到ApplicationContext對象實例后就可以手動獲取Bean的注入實例對象 */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } public static <T> T getBean(String name, Class<T> clazz) throws ClassNotFoundException { return getApplicationContext().getBean(name, clazz); } public static final Object getBean(String beanName) { return getApplicationContext().getBean(beanName); } public static final Object getBean(String beanName, String className) throws ClassNotFoundException { Class clz = Class.forName(className); return getApplicationContext().getBean(beanName, clz.getClass()); } public static boolean containsBean(String name) { return getApplicationContext().containsBean(name); } public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { return getApplicationContext().isSingleton(name); } public static Class<?> getType(String name) throws NoSuchBeanDefinitionException { return getApplicationContext().getType(name); } public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { return getApplicationContext().getAliases(name); }
//測試 public static String getCharId(String chatId) { ChatListAssociationMapper associationMapper = (ChatListAssociationMapper) SpringUtil.getBean("chatListAssociationMapper");//這個參數是spring容器里存在的,名字最好復制,大小寫要一致,不然會失敗 return associationMapper.chatId(chatId); }
}
注意以上的兩種方法都不能在main方法調用,會報空指針異常