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;
}
}