一、主要問題點
spring中的Bean由IOC容器進行管理,和普通工廠的區(qū)別就是springboot中的類不能通過自己New出來使用,如果通過new寫入到工廠,涉及到相關(guān)實現(xiàn)類調(diào)用其他Service(該service在正確情況下正常注入),注入的Service也會報錯異常Null,也就是工廠注入失敗。
二、解決和核心
工廠中的相關(guān)Bean也通過Springboot中容器注入。
核心代碼在工廠中的Map加入@Autowired注解,由該注解依賴注入相關(guān)Service。
配合實現(xiàn)類中@Service(“參數(shù)”)使用,該參數(shù)即是Map中的String。
@Autowired
//Map String表示任務類型,F(xiàn)actoryService表示對應的接口。
private Map<String, FactoryService> taskTypeMap = new HashMap<>();
三、案例
1、創(chuàng)建一個接口,該接口根據(jù)不同的任務類型獲取對應的策略。
子類實現(xiàn)該策略接口,不通的子類實現(xiàn)不同的策略方法。
/**
* @Author guaiYiBug
* @Description: 工廠接口類.
* 根據(jù)不同的任務獲取對應的策略(一個時間的邏輯判斷)
* @Date: 2023/3/6 16:59
*/
public interface TaskTimeFactoryService {
/**
*@Description: 獲取任務時間邏輯判斷
*@Param: [routine]
*@return: 返回一個判斷好的數(shù)據(jù)實體
*@Author: guaiYiBug
*@date: 2023/3/8 9:35
**/
PlanAndPortTime getTaskTime(RoutintAndWoResp routine);
2、根據(jù)任務類型分別創(chuàng)建實現(xiàn)類。
使用注解@Service(“參數(shù)”)注入。該參數(shù)對應后續(xù)的工廠中的Map,根據(jù)該參數(shù)即可 獲取到對應的實現(xiàn)類。文章來源:http://www.zghlxwxcb.cn/news/detail-405896.html
2.1 實現(xiàn)類1——dt實現(xiàn)類,也就是dt對應的策略。
@Slf4j
@Service("dt")
public class TaskTimeFactoryServiceByDtImpl implements TaskTimeFactoryService {
@Autowired
private WechatAppletService wechatAppletService;
@Override
public PlanAndPortTime getTaskTime(RoutintAndWoResp routine) {
//Do something,和普通實現(xiàn)類沒區(qū)別
return null;
}
}
2.1 實現(xiàn)類2——hh實現(xiàn)類,也就是hh對應的策略。
@Slf4j
@Service("hh")
public class TaskTimeFactoryServiceByHhImpl implements TaskTimeFactoryService {
@Autowired
private WechatAppletService wechatAppletService;
@Override
public PlanAndPortTime getTaskTime(RoutintAndWoResp routine) {
//Do something,和普通實現(xiàn)類沒區(qū)別
return null;
}
}
2.3 其他實現(xiàn)類都一樣,就省略了,注意@Service(“類型”),該參數(shù)對應著任務類型。文章來源地址http://www.zghlxwxcb.cn/news/detail-405896.html
3、創(chuàng)建工廠類
/**
* @Author guaiYiBug
* @Description: 將不同的任務類型放入到Map,
* key為任務類型,value為具體實現(xiàn)類
* @Date: 2023/3/6 17:07
*/
@Component
public class TaskTypeFactory {
/**
* @Autowired用依賴注入引入 TaskTimeFactoryService 任務實現(xiàn)類,
* 以 Bean 名稱作為 Map 的 Key,以 Bean 實現(xiàn)類作為 Value
* 配合 TaskTimeFactoryService上的注解使用,
*/
@Autowired
private Map<String, TaskTimeFactoryService> taskTypeMap = new HashMap<>();
/**
*@Description: 查找對應任務的處理實現(xiàn)類
*@Param: [taskType]
*@return: askTimeFactoryService
*@Author: guaiYiBug
*@date: 2023/3/8 9:13
**/
public TaskTimeFactoryService getTaskType(String taskType){
return taskTypeMap.get(taskType);
}
}
4、工廠調(diào)用,入?yún)⑷蝿疹愋?,工廠中獲取到對應的策略實現(xiàn)類。
//1、注入工廠
@Autowired
private TaskTypeFactory taskTypeFactory;
//2、工廠調(diào)用,獲取到對應的策略實現(xiàn)類接口。
//taskType為dt、hh等@Service("")中的注解,自動加入到容器首字母會小寫化。
TaskTimeFactoryService timeFactory = taskTypeFactory.getTaskType(taskType);
//3、接口調(diào)用實現(xiàn)方法
PlanAndPortTime planAndPortTime= timeFactory.getTaskTime(routineResp);
到了這里,關(guān)于springboot工廠模式解決if_else流程和問題點解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!