一個類啟動的時候不是最先執行靜態代碼塊么?
我現在希望的是在我這個類啟動之前執行靜態代碼塊,通過自動注入的dao去查詢資料庫加載資料(因為我不希望頻繁查,管理說不要用redis),如果直接
@Autowired
private static HolidayDao holidayDao;
這樣子,在靜態代碼塊里面會空指標,如何才能在靜態代碼塊里面用到這個dao去查詢一次資料
uj5u.com熱心網友回復:
@Resource
private KpzMapper kpzMapper;
private static KpzMapper tl;
//在靜態方法中呼叫Mapper更新資料庫
@PostConstruct
public void init() {
tl = kpzMapper;
}
在用tl去呼叫方法就行了。
uj5u.com熱心網友回復:
你的HolidayDao 是在Spring容器中的,但你當前靜態代碼塊所屬的類沒有對應的實體在Spring容器中,Spring肯定不會管理其中需要注入的HolidayDao。解決辦法:
1、在當前類中使用時直接把HolidayDao在Spring容器中的實體傳入需要使用的方法中。這種方法寫起來很惡心,不建議使用。
2、通過ApplicationContext獲取Spring容器對應的HolidayDay實體,具體如下
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
//獲取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
//使用方式
public class Test {
private static HolidayDao holidayDao = SpringUtils.getApplicationContext().getBean(HolidayDao.class);
}
3、通過Postconstruct注解
這個自己去網上找找
uj5u.com熱心網友回復:
根據你的描述,你希望在某個類被加載的時候,執行一次資料初始化,之后就可以一直使用了。所以,你希望在靜態代碼塊中完成這件事,并且還要用到spring的自動注入功能。個人認為如果要完全使用spring的方式,幾乎不可能實作。原因:spring注入屬性之前,一定先加載類,加載類就會觸發靜態代碼塊的執行,所以無解。
但是我們可以用單例的思想來達到同樣的效果。
private HolidayDao holidayDao;
private static Object data;
@Autowired
public void setHolidayDao(HolidayDao holidayDao){
this.holidayDao = holidayDao;
//雙重檢查加鎖
if(data=https://bbs.csdn.net/topics/=null){
synchronized(XXX.class){
if(data=https://bbs.csdn.net/topics/=null){
//初始化資料
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261183.html
標籤:Web 開發
