Spring之ScopeMetadata

Spring之ScopeMetadata

概述

Spring在注册bean的时候。会通过bean的作用域来决定是否使用代理模式去创建bean。如果是单例模式,那么不会使用代理,非单例就会使用。并且如果这个bean实现了接口,就会使用JDK动态代理,如果继承类,就会使用Cglib代理。
在AnnotatedBeanDefinitionReader方法doRegisterBean中,最后组装BeanDefinitionHolder的时候会决定使用代理方式:

BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
//这里没有做任何修改,即没有选择代理模式
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

ScopeMetadata

ScopeMetadata部分源码如下:

public class ScopeMetadata {

	private String scopeName = BeanDefinition.SCOPE_SINGLETON;

	private ScopedProxyMode scopedProxyMode = ScopedProxyMode.NO;

scopeName默认是singleton。这个在ConfigurableBeanFactory中作为属性。prototype就是原型模式。非单例。

String SCOPE_SINGLETON = "singleton";
String SCOPE_PROTOTYPE = "prototype";

scopedProxyMode 决定了代理模式使用哪一种方式创建对象。是一个枚举。

ScopedProxyMode

public enum ScopedProxyMode {


	DEFAULT,


	NO,


	INTERFACES,


	TARGET_CLASS

}

DEFAULT是默认的。和NO相等。主要是scopeName=singleton的时候使用。非单例模式使用INTERFACES和TARGET_CLASS。TARGET_CLASS是Cglib代理。INTERFACES是JDK动态代理模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值