spring 源码 beanDefinition.getMethodOverrides()
2017-04-11 15:33
736 查看
在Spring源代码中有这样一段代码
public Object instantiate(
RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
// Don't override the class with CGLIB if no overrides.
if (beanDefinition.getMethodOverrides().isEmpty()) {
return BeanUtils.instantiateClass(beanDefinition.getBeanClass());
}
else {
// Must generate CGLIB subclass.
return instantiateWithMethodInjection(beanDefinition, beanName, owner);
}
}
那么究竟什么时候使用JDK来创建Bean,什么时候使用CGLIB来创建Bean呢?
我注意到源代码中有以下的表述
// Don't override the class with CGLIB if no overrides.
if (beanDefinition.getMethodOverrides().isEmpty()) {
……
}
那么是什么条件才会触发这个MethodOverrides呢?
其实是Spring配置文件中的lookup-method和replace-method,
这其实是两个方法级别的注入,和一般的属性(Property)注入是不一样的,
它们注入的是方法(Method)。
两者的差别是这样的
如果需要替换的方法没有返回值,那么只能使用replace-method来替换,而不能用lookup-method来替换。
replace-method必须实现MethodReplacer接口的Bean才能替换,而lookup-method则由BeanFactory自动为我们处理了。
public Object instantiate(
RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
// Don't override the class with CGLIB if no overrides.
if (beanDefinition.getMethodOverrides().isEmpty()) {
return BeanUtils.instantiateClass(beanDefinition.getBeanClass());
}
else {
// Must generate CGLIB subclass.
return instantiateWithMethodInjection(beanDefinition, beanName, owner);
}
}
那么究竟什么时候使用JDK来创建Bean,什么时候使用CGLIB来创建Bean呢?
我注意到源代码中有以下的表述
// Don't override the class with CGLIB if no overrides.
if (beanDefinition.getMethodOverrides().isEmpty()) {
……
}
那么是什么条件才会触发这个MethodOverrides呢?
其实是Spring配置文件中的lookup-method和replace-method,
这其实是两个方法级别的注入,和一般的属性(Property)注入是不一样的,
它们注入的是方法(Method)。
两者的差别是这样的
如果需要替换的方法没有返回值,那么只能使用replace-method来替换,而不能用lookup-method来替换。
replace-method必须实现MethodReplacer接口的Bean才能替换,而lookup-method则由BeanFactory自动为我们处理了。
相关文章推荐
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册
- Ioc容器beanDefinition-Spring 源码系列(1)
- spring源码(8)注册解析的BeanDefinition
- 7-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的注册)
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【I】
- Spring源码学习--Spring配置文件解析BeanDefinitionDocumentReader(三)
- Spring源码解析--Spring配置文件解析BeanDefinitionParserDelegate(四)
- Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器
- Spring 源码阅读 BeanFactory(二) 之registerBeanDefinition方法
- 小读spring ioc源码(四)——BeanDefinitionReader
- Spring源码之旅(3)_BeanDefinition的解析与注册
- spring IOC源码学习(二):BeanDefinition资源加载
- Spring源码学习--BeanDefinitionHolder
- spring源码学习之四 BeanDefinitionParserDelegate分析
- 小读spring ioc源码(五)——BeanDefinitionDocumentReader
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【II】
- spring 源码解读与设计详解: 7 BeanDefinitionParserDelegate深入解读
- 6-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的载入和解析)
- Spring 3.2 源码解析 -- XML bean 元素到 BeanDefinition 解析过程
- Spring源码分析-BeanDefinition加载、解析和注册