模板方法
引入问题
先看一下下面这段代码
public class demo {
public static void main(String[] args) {
MyBeanFactory beanFactory = new MyBeanFactory();
beanFactory.getBean();
}
static class MyBeanFactory{
public Object getBean(){
Object bean = new Object();
System.out.println("构造 "+bean);
System.out.println("依赖注入 "+bean);
System.out.println("初始化 "+bean);
return bean;
}
}
}
这段代码是我简单的模拟了根据beanFactory调用getBean() 方法
并且简单的模拟了一下bean的生命周期的阶段
此时我提一个简单的需求,我想在依赖注入的时候能够添加@Autowired自动解析的功能,此时如果我按最暴力的方法那无疑就是在原有的代码上进行代码修改,那这就必然会带来一个问题,代码整体的扩展性不好,那我再问你,如果此时我想在依赖注入阶段在使用 @Resource解析呢?你难道还会继续在原有代码的基础上进行修改吗?
这最终的结果必定会导致这段代码非常的臃肿,可扩展性极差!
解决方法
此时,我其实可以简单的模拟一下bean后处理器对其进行扩展
下面我简单的模拟一下bean后处理器来解决上面我提出的需求
public class demo {
public static void main(String[] args) {
MyBeanFactory beanFactory = new MyBeanFactory();
processors.add(new BeanPostProcessor() {
@Override
public void inject(Object bean) {
System.out.println("解析@Autowired");
}
});
processors.add(bean -> System.out.println("解析@Resource"));
beanFactory.getBean();
}
static class MyBeanFactory{
public Object getBean(){
Object bean = new Object();
System.out.println("构造 "+bean);
System.out.println("依赖注入 "+bean);
for (BeanPostProcessor processor : processors) {
processor.inject(bean);
}
System.out.println("初始化 "+bean);
return bean;
}
}
private static List<BeanPostProcessor> processors=new ArrayList<>();
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor){
processors.add(beanPostProcessor);
}
interface BeanPostProcessor{
void inject(Object bean);
}
}
由上面的代码改进可以看出,我做的核心就是
定义了一个接口 代表 bean后处理器里面实现了增加处理的方法
创建一个集合模拟bean后处理器集合
所以在依赖注入的时候我通过遍历集合中的每一个bean后处理器,并调用后处理方法,来实现我前面提出来的需求
总结
模板方法核心:
固定不变的代码[静态代码]成为方法的主干,变化的代码[我们不确定的代码]拉出来抽象成接口