1 知识点概述
- spring控制反转+父类@PostStruct实现工厂的自动注册:实现策略的可扩展性
- 父类泛型约束+<? extend 父类> :代码规范和策略处理对象的可扩展性
- 接口枚举字符串类: 策略key的可扩展性
2.基本项目结构和概述
2.0 bean的生命周期
生命周期阶段
- 依赖注入(Dependency Injection) : 在
@PostConstruct注解的方法执行之前,所有标记为@Autowired或通过XML配置的依赖项都应该已经被注入到Bean中。 - 执行
@PostConstruct方法: 在依赖注入完成后,容器会调用标记了@PostConstruct注解的方法。这个方法可以执行任何初始化逻辑。 - Bean的完整生命周期: 执行完
@PostConstruct方法后,Bean就进入了其完整的生命周期,可以被应用程序的其他部分使用。
2.1 基本使用
目录
继承关系图
应用时,直接使用Utils中的方法,封装基本的输入输出
public static AbractStrategy demo(String strategy){
AbractStrategy<baseDTO> strategy1 = StrategyFactory.getStrategy(strategy);
System.out.println(strategy1);
return strategy1;
}
2.2 策略模式和工厂模式的代码实现
策略类 +泛型
public abstract class AbractStrategy<K extends baseDTO> {
@PostConstruct
protected void registerMyselfToFactory() {
StrategyFactory.register(getname(),this);
}
/*
* 一些通用方法
* */
protected abstract String getname();
}
@PostConstruct会在初始化类的时候加载这条方法,当继承时,子类等于也由这段代码 添加
@componet等注解时,会加载这条方法(如果不添加注解,会为空)
具体的策略实现类
@Service
public class demoStrategy2 extends AbractStrategy<App2baseDTO>{
@Override
protected String getname() {
return "name2";
}
}
工厂类
1.使用ConcurrentHashMap存储数据
2.(AbractStrategy )strategyMap.get(strategyName)泛型的强转
public class StrategyFactory {
static Map<String , AbractStrategy<?>> strategyMap = new ConcurrentHashMap<>(8);
public static <K extends baseDTO> void register(String strategyName, AbractStrategy<K> strategyService){
strategyMap.put(strategyName, strategyService);
}
@SuppressWarnings("unchecked")
public static <K extends baseDTO> AbractStrategy<K> getStrategy(String strategyName){
return (AbractStrategy<K> )strategyMap.get(strategyName);
}
}
3.测试
在普通main方法中无法调用
public static void main(String[] args) {
AbractStrategy<baseDTO> strategy = StrategyFactory.getStrategy("name2");
System.out.println(strategy);
}
在springboottest中 可以调用
void contextLoads() {
AbractStrategy demoStrategy1 = baseDTOUtils.demo("name2");
System.out.println(demoStrategy1);
}