Spring中的Bean实例化策略
InstantiationStrategy接口,定义所有支持的实例化策略的公共接口
public interface InstantiationStrategy {
Object instantiate(RootBeanDefinition var1, @Nullable String var2, BeanFactory var3) throws BeansException;
Object instantiate(RootBeanDefinition var1, @Nullable String var2, BeanFactory var3, Constructor<?> var4, @Nullable Object... var5) throws BeansException;
Object instantiate(RootBeanDefinition var1, @Nullable String var2, BeanFactory var3, @Nullable Object var4, Method var5, @Nullable Object... var6) throws BeansException;
}
它有两个实现类,分别是SimpleInstantiationStrategy和CglibSubclassingInstantiationStrategy
SimpleInstantiationStrategy
做一些简单的根据构造函数实例化Bean的操作,就是根据xml中配置的类的全类名反射出Class对象并实例化Bean。这个策略实现类不支持方法注入
CglibSubclassingInstantiationStrategy
继承了SimpleInstantiationStrategy并新增了方法注入方式根据cglib方式生成代理类实例化方法
AbstractAutowireCapableBeanFactory中管理了InstantiationStrategy的一个对象,实例化Bean的默认实现是CglibSubclassingInstantiationStrategy策略,如果想改变策略,可以调用setInstantiationStrategy改变实例化策略
根据此BeanFactory的构造方法可以看出其默认调用的策略是CglibSubclassingInstantiationStrategy
通过此方法改变生成bean的策略
如果想自定以Bean的生成策略的话,写一个实现类继承InstantiationStrategy接口,再在BeanFactory调用的时候,设置自己的策略就ok了。
当然AbstractAutowireCapableBeanFactory中定义其它许多于Bean相关的方法,不仅有实例化,还有注入,销毁等方法
DefaultListableBeanFactory还有个实现类,XmlBeanFactory
/** @deprecated */
@Deprecated
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader;
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, (BeanFactory)null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader = new XmlBeanDefinitionReader(this);
this.reader.loadBeanDefinitions(resource);
}
}
xml配置的文件,使用的就是这个BeanFactory,可以看出,在没有BeanFactory对象传入的时候,也会调用父类的方法,parentBeanFactory为空:
最后调用了AbstractAutowireCapableBeanFactory的构造方法,默认使用上文提到过的策略来实例化Bean
这里的setParentBeanFactory方法是调用了父类的方法:
查看setParentBeanFactory方法:
关于Spring中Bean实例化使用到的策略模式,大体上就这么多了,主要就是策略模式的使用以及cglib代理的一些东西。