当让我们设计一个简易的beanfactory时,我们会这样写
public class TemplateMethod {
public static void main(String[] args) {
MyBeanFactory factory = new MyBeanFactory();
factory.getBean();
}
static class MyBeanFactory{
public void getBean(){
Object bean = new Object();
System.out.println("实例化"+bean);
System.out.println("属性注入"+bean);
System.out.println("初始化"+bean);
}
}
}
但是,比如当我们扩展属性注入增加@Autowired时,你会怎么做,是直接在属性注入下边再加一个处理吗?这样的话,扩展起来太麻烦了,因为我们可能还有其他扩展比如再增加@Resource等。那怎么做起来会改进呢?
我们把需要扩展的方法(属性注入)创建一个接口
static interface BeanPostProcessor{
void inject(Object bean);
}
然后在需要扩展的地方进行调用扩展,属性注入这块代码就变成了
System.out.println("属性注入"+bean);
for (BeanPostProcessor list : lists){
list.inject(bean);
}
当然少不了声明列表以及对lists的添加
private List<BeanPostProcessor> lists = new ArrayList<>();
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor){
lists.add(beanPostProcessor);
}
最终改造后的代码
public class TemplateMethod {
public static void main(String[] args) {
MyBeanFactory factory = new MyBeanFactory();
factory.getBean();
}
static class MyBeanFactory{
private List<BeanPostProcessor> lists = new ArrayList<>();
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor){
lists.add(beanPostProcessor);
}
public void getBean(){
Object bean = new Object();
System.out.println("实例化"+bean);
System.out.println("属性注入"+bean);
for (BeanPostProcessor list : lists){
list.inject(bean);
}
System.out.println("初始化"+bean);
}
}
static interface BeanPostProcessor{
void inject(Object bean);
}
}
如果我们想加上对@Autowired的处理
public static void main(String[] args) {
MyBeanFactory factory = new MyBeanFactory();
factory.addBeanPostProcessor(bean -> System.out.println("新增@Autowired的处理"));
factory.getBean();
}
执行,打印结果为
实例化java.lang.Object@5e9f23b4
属性注入java.lang.Object@5e9f23b4
新增@Autowired的处理
初始化java.lang.Object@5e9f23b4
如果想要新增其他处理,则类似