接口类:
@Service
public interface AppCertMsgService {
public Map<String, Object> saveCardMsg(AppCertMsg appCertMsg, String channelNo);
public Map<String, Object> getCardMsgByCertNo(String certNo);
}
实现类:
@Service
public class AppCertMsgServiceImpl extends BaseService implements AppCertMsgService {
@Autowired
AppCertMsgRepository appCertMsgRepository;
@Autowired
CrmService crmService;
@Override
public Map<String, Object> saveCardMsg(AppCertMsg appCertMsg, String channelNo) {
logger.info("saveCardMsg:===>" + appCertMsg); //继承类BaseService 中的logger 属性
return success();
}
@Override
public Map<String, Object> getCardMsgByCertNo(String certNo) { //所要实现的接口里的方法
AppCertMsg appCertMsg = appCertMsgRepository.getCardMsgByCertNo(certNo);
return success(appCertMsg); //继承类的方法
}
}
继承类BaseService:
public class BaseService { public Log logger = LogFactory.getLog(getClass()); @Autowired protected RestTemplate restTemplate; @Value("${common.address.gateUrl}") private String gateUrl; public BaseService() { }protected Map<String, Object> success(String retMsg) { Map<String, Object> returnMap = RestUtil.success(); ResultHead head = (ResultHead) returnMap.get("head"); head.setRetMsg(retMsg); returnMap.put("head", head); return returnMap;
} }
实现:
接口类存在的意义:
1.一种规范。在一些大型项目中,接口和实现往往不是同一个人负责;而接口的调用方也有可能是其他人。所以接口完善了,而在实现类还没有完成的情况下,调用方也可以继续调用接口,只需要关心输入输出,不用在意实现过程;这样实现类的开发和调用类的开发可以并行,提高开发效率;
2. 高扩展。一个接口可以有多个实现类,实现不同的功能。在注入的时候做选择,也是一种多态的体现;
3. JAVA 只支持单继承,单可以实现多个接口;接口也就有存在意义了。
Spring注解将复杂的配置文件用简单@xxx代替,当出现一个接口多个实现类的时候,究竟是用的哪个实现类呢?
示例代码:
public interface DataDao{
}
@Service
public class ImgDataDao implements DataDao{
}
@Service
public class PayDataDao implements DataDao{
}
public class TestCase{@Resource
private DataDao imgDataDao;
@Resource
private DataDao payDataDao;
}
1)利用@Service注解自动将类ImgDataDao和类PayDataDao注解为bean,id为imgDataDao和payDataDao,即类ImgDataDao和类PayDataDao的第一个字母小写的id。
2)@Resource按byName自动注入,@Autowired按byType自动注入;
3)@Resource可用@Autowired替换
4)当不想用默认的imgDataDao和payDataDao----id命名时,可用变为如下:
@Resource(name="imgDataDao")
private DataDao xx;
或者:
@Autowired
@Qualifier("imgDataDao")
private DataDao yy;