1. 問題描述
在一個BO對象里面, 比如描述團品的對象HotelGroup(是不普通類, 沒有spring的注解)里面, 需要調用一個被spring注解的service, 獲取一個數據, 比如, 團品下面的酒店列表, 必須調用service來獲取.
2. 矛盾點
用上面提到的HotelGroup指代要調用spring注解的service的類, 用DataService指代被調用的spring依賴注入注解的service類.
由於HotelGroup用來表達業務對象, 會有很多團品, 所以不應該被注解, 而DataService是個服務, 應該注解.
spring的體系里面, 想要調用被注解的對象方法, 比如把自己加入到注解體系里面, 這就是普通玩法不能搞定的原因.
3.解法
關注點, 就是, 對於"如何不加入spring體系, 卻能調用spring的體系內的方法"的回答.
解法是, 創建一個注解的類, 這個類里面把DataService給做成static 的成員變量, 這樣, spring體系內部的一個單件對象, 就被搞進了static區里面.
我們在普通類里面調用某個類的static方法是可以簡單做到的.
這樣我們就可以堂而皇之地在任何類里面調用這個曾經只能加入spring體系才能調用的服務.
4.實例代碼
package com.qunar.des.phoenix.util;
import com.qunar.des.phoenix.entity.bo.Hotel; import com.qunar.des.phoenix.entity.bo.HotelGroup; import com.qunar.des.phoenix.index.DataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** * 用來在非spring注解的類內部, 調用spring注解的service等代碼. * 目前沒有在實際邏輯中調用. * Created by fangxue.zhang on 2014/7/26 */ @Service public final class IndexUtil { private static final Logger logger = LoggerFactory.getLogger(IndexUtil.class); private static DataService dataService; @Resource public void setDataService(DataService dataService) { IndexUtil.dataService = dataService; } public static List<Hotel> getHotels(List<String> seqs) { List<Hotel> hotels = new ArrayList<Hotel>(); for (String seq : seqs) { Hotel hotel = dataService.getHotel(seq); if (hotel != null) hotels.add(hotel); else { logger.warn("null hotel for seq : {}", seq); } } return hotels; } public static DataService getDataService() { return dataService; } public static List<HotelGroup> getHotelGroups(List<Long> teamIds) { List<HotelGroup> hotelGroups = new ArrayList<HotelGroup>(); for (Long teamId : teamIds) { HotelGroup hotelGroup = dataService.getHotelGroup(teamId); if (hotelGroup != null) hotelGroups.add(hotelGroup); else { logger.warn("null teamfor teamId : {}", teamId); } } return hotelGroups; } }