Spring中的Bean实例化策略

本文探讨了Spring中Bean的实例化策略,包括InstantiationStrategy接口及其SimpleInstantiationStrategy和CglibSubclassingInstantiationStrategy两个实现类。CglibSubclassingInstantiationStrategy作为默认策略,支持方法注入。可以通过AbstractAutowireCapableBeanFactory的setInstantiationStrategy方法改变实例化策略。此外,还提及了BeanFactory和XmlBeanFactory在Bean生命周期管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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代理的一些东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值