IService接口里面的方法都是非静态的,而DB是静态工具,所以里面的方法都是静态的。我们的Iservice接口是非静态的,所以我们需要自定义接口并且继承它继承的过程中还要去指定泛型。泛型就是实体类的类型,因为它要通过反射得到实体类字节码,才能知道表信息,才能实现增删改查。而静态工具它由于是静态的,类上是不可能有泛型的,或者说静态的方法是没有办法读取到类上的泛型的。因此DB上面是没有泛型的,这就导致了它没有办法知道实体类的类型,无法知道表信息,不能去做增删改查。所以它的方法都需要传一个额外的参数,比如说removeById方法,除了传一个id以外还需要传一个class字节码文件,这个字节码其实就是实体类的字节码,因为只有传了这个,它才能利用反射拿到这个实体类的相关信息,从而得到注解上面的一些类名、表名等等这些信息才能实现增删改查。
这就意味着在addressService里要注入userService,现在出现了一种情况,我们在实现有些业务的时候,我们需要在userService里实现但是需要去查address表,所以需要注入addressService,而有些业务在addressService里面但是要查user表,所以需要注入userService。于是两个service需要相互注入,就出现了循环依赖的情况,为了解决这个循环依赖的情况,我们就可以用DB静态工具去解决。我们在userService里调addressService的时候,直接调静态工具来查询,可以达到相同效果,而且不需要去注入,这样就避免了循环依赖。
package com.itheima.mp.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(description = "用户VO实体")
public class UserVO {
@ApiModelProperty("用户id")
private Long id;
@ApiModelProperty("用户名")
private String username;
@ApiModelProperty("详细信息")
private String info;
@ApiModelProperty("使用状态(1正常 2冻结)")
private Integer status;
@ApiModelProperty("账户余额")
private Integer balance;
@ApiModelProperty("用户的收货地址")
private List<AddressVO> address;
}
package com.itheima.mp.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* <p>
*
* </p>
*
* @author 虎哥
* @since 2023-07-01
*/
@Data
@ApiModel(description = "收货地址VO")
public class AddressVO{
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("用户ID")
private Long userId;
@ApiModelProperty("省")
private String province;
@ApiModelProperty("市")
private String city;
@ApiModelProperty("县/区")
private String town;
@ApiModelProperty("手机")
private String mobile;
@ApiModelProperty("详细地址")
private String street;
@ApiModelProperty("联系人")
private String contact;
@ApiModelProperty("是否是默认 1默认 0否")
private Boolean isDefault;
@ApiModelProperty("备注")
private String notes;
}
·测试
总结
我们在开发业务的时候,有的时候会出现一种场景就是多个service之间会相互调用,如果我们采用传统的方式也就是@Autowired去注入的方式,那service之间相互注入就会出现循环依赖,这就给我们开发带来很大的麻烦,因此我们的建议是一旦出现service相互调用,可以使用DB静态工具去调用。DB静态工具里的方法跟IService的方法几乎一样,调的时候需要指定字节码,这样既方便又可以避免循环依赖。