概述
传入对象参数通过cglib实例化代理对象
整体设计
知识补充
/**
*
* @param beanDefinition
* @param beanName
* @param ctor 构造方法
* @param args 参数
* @return
* @throws BeansException
*/
@Override
public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException {
//该代理类可以用来拦截目标对象的方法调用,并执行自定义的逻辑。
Enhancer enhancer = new Enhancer();
//设置Enhancer对象的父类为beanDefinition的BeanClass
enhancer.setSuperclass(beanDefinition.getBeanClass());
//设置Enhancer对象的回调为一个匿名的NoOp对象,该对象重写了hashCode()方法
enhancer.setCallback(new NoOp() {
@Override
public int hashCode() {
return super.hashCode();
}
});
//如果传入的构造函数参数ctor为null,则通过Enhancer对象创建一个代理对象并返回
if (null == ctor){
return enhancer.create();
}
//传入的构造函数参数ctor不为null,则通过Enhancer对象创建一个代理对象,并使用传入的构造函数和参数进行初始化
return enhancer.create(ctor.getParameterTypes(), args);
}
类图
时序图
- 创建工厂DefaultListableBeanFactory
- 注册bean(相关类信息),将注册的类信息放入DefaultListableBeanFactory的map中
- 通过bean工厂获取类的对象
调用继承了抽象类AbstractAutowireCapableBeanFactory继承的AbstractBeanFactory的getBean方法
从抽象类AbstractBeanFactory继承的DefaultSingletonBeanRegistry类的getSingleton方法获取类信息 - 存在的话返回
- 不存在的话从AbstractBeanFactory的子类DefaultListableBeanFactory中获取bean定义
- 从子类AbstractAutowireCapableBeanFactory中创建对象
获取Class类信息(通过参数个数去获取指定的构造方法,否则传入无参的构造方法)
指定Cglib的子类CglibSubclassingInstantiationStrategy通过cglib实例化并返回Object
将实例化后的对象放到继承的抽象类AbstractBeanFactory继承的DefaultSingletonBeanRegistry类中的map中
返回实例化后的bean - 返回bean对象
小结
可优化的点:
如上的Cglib代码,如果代理的对象存在多个相同参数的构造方法时
会报错:Caused by: java.lang.IllegalArgumentException: argument type mismatch