當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
【java】Spring开发中不能使用IOC的情况
生活随笔
收集整理的這篇文章主要介紹了
【java】Spring开发中不能使用IOC的情况
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
????? 在實(shí)際開發(fā)中,有些業(yè)務(wù)場(chǎng)景我們不能使用注解@Autowire、@Resource、@Inject等自動(dòng)注入Bean。在多線程的環(huán)境下,我們調(diào)用Bean的方法來處理我們的業(yè)務(wù)數(shù)據(jù),但是需要處理的數(shù)據(jù)資源都是單獨(dú)的,主要針對(duì)需要處理的數(shù)據(jù)資源屬于Bean的成員變量,例如:
@Component("withdrawKHQueryResultExecutor") public class OnlineWithdrawKHQueryResultExecutor implements Callable<String>{private ErrorTask errorTask;@Resourceprivate IOnlineWithdrawQueryService onlineWithdrawQueryService;@Resourceprivate IMerchInfoService merchInfoService;@Resourceprivate OnlineWithdrawHandler onlineWithdrawHandler;@Overridepublic String call() throws Exception {String txnId = errorTask.getTxnId();String finalSts = errorTask.getFinalStatus();BillBizSimple simple = onlineWithdrawQueryService.queryBillBizSimle(txnId);MerchInfo merchInfo = merchInfoService.selectByMerchId(simple.getMerchId());if(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue().equals(finalSts)){onlineWithdrawHandler.handleFirstPostingFail(simple,merchInfo,errorTask);}return "執(zhí)行成功!";}public ErrorTask getErrorTask() {return errorTask;}public void setErrorTask(ErrorTask errorTask) {this.errorTask = errorTask;}}?對(duì)于我們來說,errorTask就是需要我們傳入的資源,再來看調(diào)用的方法代碼: @Component("withdrawKHQueryResultJob") public class WithdrawKHQueryResultJob {private static final Logger logger = Logger.getLogger(WithdrawKHQueryResultJob.class);private static final int FIXED_THREAD_POOL_NUM = 5;private static ExecutorService threadPool = Executors.newFixedThreadPool(FIXED_THREAD_POOL_NUM);private static List<String> finalStsList;@Resourceprivate IErrorTaskService errorTaskService;@Resourceprivate OnlineWithdrawKHQueryResultExecutor withdrawKHQueryResultExecutor;@Overridepublic void runJob(String batchDate) throws Exception {try{// 計(jì)算5分鐘之前的時(shí)間Date modTime = DateUtil.getTimeByMinute(-5);// 查詢條件ErrorTaskExampleExt example = new ErrorTaskExampleExt();example.createCriteria().andFinalStatusIn(finalStsList).andModifyTimeGreaterThanOrEqualTo(modTime);// 總記錄數(shù)int totalRecords = errorTaskService.countByExample(example);logger.info(getJobId()+"本次執(zhí)行總記錄數(shù):" + totalRecords);final CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool);Pager pager = new Pager(totalRecords, Constant.QUERY_DBDATE_PAGE_SIZE);if(pager.getTotal() > 0){for (int page = 1,n=pager.getPages(); page <= n; page++) {example.setStart((page-1)*pager.getPageSize());example.setLimit(pager.getPageSize());List<ZbErrorTask> handleList= errorTaskService.selectByExampleByPage(example);if (!CollectionUtils.isEmpty(handleList)) {for (int i = 0, m = handleList.size(); i < m; i++) {ZbErrorTask errorTask = handleList.get(i);withdrawKHQueryResultExecutor.setErrorTask(errorTask);Future<String> future = completionService.submit(withdrawKHQueryResultExecutor);}}}}}catch(Exception e){e.printStackTrace();}}static{finalStsList = new ArrayList<String>();finalStsList.add(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue());}}我們把withdrawKHQueryResultExecutor當(dāng)做參數(shù)進(jìn)行了執(zhí)行,這樣多線程執(zhí)行就會(huì)出問題,我們知道 spring bean 的作用域,
一般常用的有singleton、prototype看來本例中我們的bean需要使用prototype作用域來處理了。我們獲取Spring Bean的方式也需要調(diào)整下,目前利用了Spring的IOC來注入,那我們還有另外一個(gè)方式來獲取Bean,那就是我們需要自己來寫一個(gè)工具類,需要實(shí)現(xiàn)Spring的ApplicationContextAware接口,關(guān)于用法網(wǎng)上的講解很多,自行解決,下面看工具類的代碼:
public class SpringContextUtil implements ApplicationContextAware {@Autowiredprivate static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringContextUtil.context=applicationContext;}public static <T> T getBean(String name, Class<T> requiredType){return context.getBean(name, requiredType);}public static Object getBean(String name){return context.getBean(name);}public static <T> Object getBean(Class<T> requiredType){return context.getBean(requiredType);}public static ApplicationContext getContext() {return context;}public static void setContext(ApplicationContext context) {SpringContextUtil.context = context;}}這樣我們就開始調(diào)整程序了,最終的代碼程序如下: @Scope("prototype") @Component("withdrawKHQueryResultExecutor") public class OnlineWithdrawKHQueryResultExecutor implements Callable<String>{private ErrorTask errorTask;@Resourceprivate IOnlineWithdrawQueryService onlineWithdrawQueryService;@Resourceprivate IMerchInfoService merchInfoService;@Resourceprivate OnlineWithdrawHandler onlineWithdrawHandler;@Overridepublic String call() throws Exception {String txnId = errorTask.getTxnId();String finalSts = errorTask.getFinalStatus();BillBizSimple simple = onlineWithdrawQueryService.queryBillBizSimle(txnId);MerchInfo merchInfo = merchInfoService.selectByMerchId(simple.getMerchId());if(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue().equals(finalSts)){onlineWithdrawHandler.handleFirstPostingFail(simple,merchInfo,errorOrderTask);}return "執(zhí)行成功!";}public ErrorTask getErrorTask() {return errorTask;}public void setErrorTask(ErrorTask errorTask) {this.errorTask = errorTask;}}
@Component("withdrawKHQueryResultJob") public class WithdrawKHQueryResultJob {private static final Logger logger = Logger.getLogger(WithdrawKHQueryResultJob.class);private static final int FIXED_THREAD_POOL_NUM = 5;private static ExecutorService threadPool = Executors.newFixedThreadPool(FIXED_THREAD_POOL_NUM);private static List<String> finalStsList;@Resourceprivate IErrorTaskService errorTaskService;@Overridepublic void runJob(String batchDate) throws Exception {try{// 計(jì)算5分鐘之前的時(shí)間Date modTime = DateUtil.getTimeByMinute(-5);// 查詢條件ErrorTaskExampleExt example = new ErrorTaskExampleExt();example.createCriteria().andFinalStatusIn(finalStsList).andModifyTimeGreaterThanOrEqualTo(modTime);// 總記錄數(shù)int totalRecords = errorTaskService.countByExample(example);logger.info(getJobId()+"本次執(zhí)行總記錄數(shù):" + totalRecords);final CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool); Pager pager = new Pager(totalRecords, Constant.QUERY_DBDATE_PAGE_SIZE);if(pager.getTotal() > 0){for (int page = 1,n=pager.getPages(); page <= n; page++) {example.setStart((page-1)*pager.getPageSize());example.setLimit(pager.getPageSize());List<ZbErrorTask> handleList= errorTaskService.selectByExampleByPage(example);if (!CollectionUtils.isEmpty(handleList)) {for (int i = 0, m = handleList.size(); i < m; i++) {ZbErrorOrderTask errorOrderTask = handleList.get(i);OnlineWithdrawKHQueryResultExecutor withdrawKHQueryResultExecutor = (OnlineWithdrawKHQueryResultExecutor) SpringContextUtil.getBean("withdrawKHQueryResultExecutor");withdrawKHQueryResultExecutor.setErrorOrderTask(errorOrderTask);Future<String> future = completionService.submit(withdrawKHQueryResultExecutor);}}}}}catch(Exception e){e.printStackTrace();}}static{finalStsList = new ArrayList<String>();finalStsList.add(FilnalStatusEnum.C_FIRST_POST_FAIL.getValue());}}
總結(jié)
以上是生活随笔為你收集整理的【java】Spring开发中不能使用IOC的情况的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常检测算法之LOF
- 下一篇: 关于response格式转换