您好,登录后才能下订单哦!
本篇内容介绍了“怎么用Springboot根据配置文件动态注入接口实现类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
最近在做一个Springboot项目,需要面向不同需求的客户,但是为了方便管理分支,需要将不同客户的需求都写到同一套代码中,根据不同客户实例化对应的实现类。
为了尽量不修改代码,少做不必要的逻辑判断,我们考虑为不同客户写不同的Service,然后根据配置参数实例化对应的Service。这样就遇到了需要根据配置文件实现不同类的需求。
针对这一需求大致有两种实现方式。但是针对我的需求,能用的只有第二种,但还是想将第一种一起总结一下。
两种方式都需要给定义接口,并针对不同客户对接口做不同实现。
public interface IAService { //获取客户名,所有客户都需要,但是需要针对不同客户做不同实现 String getCustomName(); }
针对客户A和B对上面接口实现两个类
//注意要给Service命名 @Service("customA") public class IAServiceShijiazhuangImpl implements IAService{ //A客户的逻辑 @Override public String getCustomName() { return "客户A"; } } //注意要给Service命名 @Service("customB") public class IAServiceLinyiImpl implements IAService{ //客户B的逻辑 @Override public String getCityName() { return "客户B"; } }
Service层写好以后,需要在Controller层做不同的实现。有两种方式
在@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(); } }
上面配置了两个不同客户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项目中可能出现一个接口有多个实现类的情况,如果不进行配置,注入接口时编译器不知道要注入哪个实现类就会报错,因此需要进行配置。
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 @RequestMapping("notice") public class NoticeController{ @Autowired NoticeService noticeService; }
@Controller @RequestMapping("notice") public class NoticeController{ @Autowired @Qualifier("impl1") NoticeService noticeService; }
@Service("impl1") public class NoticeServiceImpl1 implements NoticeService { public String noticeUser(Long id){ return noticeServe1(id); } }
此时再运行即可~
“怎么用Springboot根据配置文件动态注入接口实现类”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。