使用Springboot根据配置文件动态注入接口实现类

网友投稿 1540 2022-12-18

使用Springboot根据配置文件动态注入接口实现类

使用Springboot根据配置文件动态注入接口实现类

Springboot根据配置文件动态注入接口实现类

需求

最近在做一个Springboot项目,需要面向不同需求的客户,但是为了方便管理分支,需要将不同客户的需求都写到同一套代码中,根据不同客户实例化对应的实现类。

实现

为了尽量不修改代码,少做不必要的逻辑判断,我们考虑为不同客户写不同的Service,然后根据配置参数实例化对应的Service。这样就遇到了需要根据配置文件实现不同类的需求。

针对这一需求大致有两种实现方式。但是针对我的需求,能用的只有第二种,但还是想将第一种一起总结一下。

两种方式都需要给定义接口,并针对不同客户对接口做不同实现。

接口类

public interface IAService {

//获取客户名,所有客户都需要,但是需要针对不同客户做不同实现

String getCustomName();

}

针对客户A和B对上面接口实现两个类

//注意要给Service命名

@Service("customA")

public class IAServiceShijiazhuangImpl implements IAService{

//A客户的逻辑

@Override

public String getCustomName() {

http:// return "客户A";

}

}

//注意要给Service命名

@Service("customB")

public class IAServiceLinyiImpl implements IAService{

//客户B的逻辑

@Override

public String getCityName() {

return "客户B";

}

}

Service层写好以后,需要在Controller层做不同的实现。有两种方式

1.使用@Qualifier注解

在@Qualifier("customA")上标明要实现的类的Service填写的名字即可。但是这种方式有个弊端。Qualifier注解的参数必须是常量,无法填写配置文件的值,因此无法使用配置文件动态注入,只能动手改代码,基本是鸡肋般的存在。

@RestController

public class AController {

//如果要给客户A部署,这里写客户A Service注解的名称,上面配置的是customA

@Qualifier("customA")

IAService iaService;

//不同地区需要有不同的逻辑,下面service实例化的正好是不同地区的实例

@GetMapping("/name")

public String getCustomName() {

return iaService.getCityName();

}

}

2.使用@Resource注解

上面配置了两个不同客户Service注解的名称,我们可以使用Resource注解,通过配置文件的方式进行动态注入。通过配置文件进行灵活切换。

其实代码并没有多少改动,仅仅是换成了@Resource(name="${local.name}")而已,其中的local.name为从配置文件中要读取的变量对应的值。

@RestController

public class AController {

//根据配置文件中配置的参数决定实例化哪个实现类,解决上面问题1

@Resource(name="${local.name}")

IAService iaService;

//不同地区需要有不同的逻辑,下面service实例化的正好是不同地区的实例

@GetMapping("/name")

public String getCustomName() {

return iaService.getCityName();

}

}

SpringBoot同一接口多个实现类配置

SpringBoot项目中可能出现一个接口有多个实现类的情况,如果不进行配置,注入接口时编译器不知道要注入哪个实现类就会报错,因此需要进行配置。

以下进行举例:

接口如下:

public interface NoticeService {

public String noticeUser(Long id);

}

两个实现类如下:

@Service

public class NoticeServiceImpl1 implements NoticeService {

public String noticeUser(Long id){

return noticeServe1(id);

}

}

@Service

public class NoticeServiceImpl2 implements NoticeService {

public String noticeUser(Long id){

return noticeServe2(id);

}

}

Controller如下:

@Controller

@RequestMapping("notice")

public class NoticeController{

@Autowired

NoticeService noticeService;

}

这样直接启动后就会报错,需要在添加@Qualifier注解:

@Controller

@RequestMapping("notice")

public class NoticeController{

@Autowired

@Qualifier("impl1")

NoticeService noticeService;

}

需要调用的实现类中添加标识:

@Service("impl1")

public class NoticeServiceImpl1 implements NoticeService {

public String noticeUser(Long id){

return noticeSeBcXnRQuuQqrve1(id);

}

}

此时再运行即可~

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用BigDecimal去掉小数点后无用的0
下一篇:开发个直播app大概需要多少钱(直播软件开发需要多少钱)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~