作用:增加代码的可扩展性
背景:模拟一个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;
}
}
可见构造,依赖,初始化的逻辑在代码中写死了,而且不能有多种组合
模板方法实现扩展依赖注入的功能:
1.定义一个后处理器的接口
static interface BeanPostProcessor{
public void inject(Object bean);
}
2.在BeanFactory内部添加一个后处理器列表的成员,一开始为空,并添加一个add方法
private List<BeanPostProcessor> processors=new ArrayList<>();
public void addProcessor(BeanPostProcessor processor){
processors.add(processor);
}
3.在依赖注入逻辑处遍历集合,执行后处理器对应的方法
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;
}
4.想调用getBean时可以加入自己想实现的依赖注入的后处理器
beanFactory.addProcessor(new BeanPostProcessor() {
@Override
public void inject(Object bean) {
System.out.println("解析@Autowired。。。");
}
});
5.调用getBean方法,即可实现自定义的代码逻辑
beanFactory.getBean();
打印:
6.接口只有一个方法,可以进一步用lamba表达式简化
beanFactory.addProcessor(bean -> System.out.println("解析@Autowired。。。"));
beanFactory.addProcessor(bean -> System.out.println("解析@Resource。。。"));
beanFactory.addProcessor(bean -> System.out.println("解析@Value。。。"));
打印:
可见,大大提高了代码的可扩展性
使用场景:1.不确定之后要实现什么功能
2.功能种类丰富,不能写死
204

被折叠的 条评论
为什么被折叠?



