Spring手撸源码系列-支持构造函数入参方式的类的实例化

本篇博客介绍了如何在Spring框架中支持有参构造函数实例化Bean,包括在BeanFactory接口、AbstractBeanFactory抽象类、AbstractAutowireCapableBeanFactory抽象类以及InstantiationStrategy接口和其实现类中的改动。通过Cglib和JDK两种方式实现Bean的实例化,并提供了测试案例。

上一章节我们实现了可以对Bean对象进行定义、注册、获取Bean对象的功能,这一章节在此基础上改造可以支持加载类的构造函数以及入参方式来实例化Bean。

 首先上一章其实在UserService类里添加有参构造函数然后运行是会报错的。因为创建bean方法时实例化beanDefinition.getBeanClass().newInstance();实例化方式并没有考虑构造函数的入参,所以就会报错

public class UserService {
    private String name;

    public UserService(String name) {
        this.name = name;
    }  

    public void queryUserInfo(){
        System.out.println("查询用户信息");
    }
}

 这一章节就来填平这个错误

1.工程实现

 

2.UML类图

就像我们写的系统程序一样,新添加一个需求总会需要修改对应的类与方法,那么下面标红的就是在原有的类上面添加的方法与属性。

BeanFactory更改点:

我们考虑一下我们要加入参,入参参数肯定是用户给我们的,用户什么时候给的呢,就是在getBean()时将参数给我们的,这样我们才能将数据一一向各个实现的子类传递,最后进行实例化操作,所以现在BeanFactory这里重载支持参数的方法Object getBean(String name,Object... args)你就应该能理解

AbstractBeanFactory更改点:

上节是模板方法,像个大集合,把该做的都聚集一起,但是具体实现由各个子类实现,自己只做模板,哈哈,这节还是这样,但是上节只支持无参,这节需要既能支持有参又能支持无参所以,也是添加了重载方法getBean(),抽取了添加doGetBean()做模板方法,还是上一节一样的方式。

AbstractAutowireCapableBeanFactory更改点:

这个类里就是更改了实现createBean()添加了入参的参数,然后又添加了createBeanInstance()用来可以获取构造方法的参数获取方式。但是你也看见了,这个类里依赖了一个类为InstantiationStrategy,这个类之前是没有的,后创建的作用是什么呢,回到思路上我们是获取了构造函数等参数什么的,但是我们还没有实例化啊,怎么实例化呢?所以InstantiationStrategy接口就是干这个用的。在此类中依赖实例化策略类接口,想使用Cglib方式用Cglib,想用Jdk方式就用jdk方式,这样的设计不需要if,else,

InstantiationStrategy instantiati

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值