前言
启动类启动,加载策略模式的子类,最终将数据收集到map。
由程序启动带动注入
构成
父接口
public interface TestInterface {
/**
* 策略注册方法
*
* @param batchType
*/
default void injection(String batchType) {
BillBusinessStrategyFactory.register(batchType, this);
}
}
实现类1
@Component
public class testClass implements TestInterface, InitializingBean {
// 不需要单独重写,重写在InitializingBean的@Override 的方法:afterPropertiesSet
// 会随着启动类的启动自动执行
// @Override
// public void injection(String batchType) {
// injection("1");
// }
@Override
public void afterPropertiesSet() throws Exception {
injection("1");
System.err.println("1");
}
}
实现类2
@Component
public class testClass2 implements TestInterface, InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
injection("2");
System.err.println("2");
}
}
策略工厂类
@Component
public class BillBusinessStrategyFactory {
private static final Map<String, TestInterface> STRATEGY_CONCURRENT_HASH_MAP = new ConcurrentHashMap<>();
// /**
// * 提供获取策略的方法
// *
// * @param batchTypeEnum
// * @return
// */
// public static BillBusinessService getStrategy(BatchEnums.BillBatchTypeEnum batchTypeEnum) {
// BillBusinessService sendService = STRATEGY_CONCURRENT_HASH_MAP.get(batchTypeEnum.getKey());
// Assert.notNull(sendService, "批次类型无效");
// return sendService;
// }
/**
* 在Bean属性初始化后执行该方法
*
* @param batchTypeEnum 批次类型枚举
*/
public static void register(String batchTypeEnum, TestInterface testInterface) {
STRATEGY_CONCURRENT_HASH_MAP.put(batchTypeEnum, testInterface);
}
}
启动流程
1:项目启动
2:扫描到InitializingBean接口,执行afterPropertiesSet方法
3:执行afterPropertiesSet方法,接触到injection(父接口的重写方法)
备注:
如果只实现父接口,需要单独重写injection方法
但当实现InitializingBean接口后,父接口的方法需要写在InitializingBean强制重写的afterPropertiesSet内