Scope注解
Scope Proxy Mode Machanism
NO/DEFAULT
Scope | 行为 |
---|---|
singleton | 每次调用BeanFactory.getBean返回相同实例 |
prototype | 每次调用BeanFactory.getBean返回不同实例 |
Spring不会做任何代理,如果我们在某个单例对象中注入了一个prototype
实例,在整个单例的生命周期,它是不会变化的,除非我们通过BeanFactory.getBean
调用重新获取一个实例,才能保证每次进入新的scope
使用的都是新的实例
INTERFACE
Scope | 行为 |
---|---|
singleton | 每次调用BeanFactory.getBean返回相同实例 |
prototype | 每次调用BeanFactory.getBean返回相同实例 |
假设我们定义了一个bean:
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.INTERFACE)
public TestClassScopeProxyMode testClassScopeProxyMode() {
return new TestClassScopeProxyMode();
}
则Spring会在ApplicationContext
中注册两个Bean定义:
1、名称为testClassScopeProxyMode
,类型为ScopedProxyFactoryBean
的单例Bean
2、名称为scopedTarget.testClassScopeProxyMode
,类型为TestClassScopeProxyMode
的Bean(原始的Bean定义)
在每次通过BeanFactory.getBean
获取testClassScopeProxyMode
名称的bean时,都会通过ScopedProxyFactoryBean
返回一个固定的JDK代理实例,当在该代理对象中调用某个接口的方法时,JdkDynamicAopProxy
会拦截调用,先通过BeanFactory.getBean
获取scopedTarget.testClassScopeProxyMode
名称的bean(即原始定义的bean),然后在该对象上进行实际的方法调用
根据JDK代理的特性,该模式只对接口方法生效!!
TARGET_CLASS
Scope | 行为 |
---|---|
singleton | 每次调用BeanFactory.getBean返回相同实例 |
prototype | 每次调用BeanFactory.getBean返回相同实例 |
假设我们定义了一个bean:
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.INTERFACE)
public TestClassScopeProxyMode testClassScopeProxyMode() {
return new TestClassScopeProxyMode();
}
则Spring会在ApplicationContext
中注册两个Bean定义:
1、名称为testClassScopeProxyMode
,类型为ScopedProxyFactoryBean
的单例Bean
2、名称为scopedTarget.testClassScopeProxyMode
,类型为TestClassScopeProxyMode
的Bean(原始的Bean定义)
在每次通过BeanFactory.getBean
获取testClassScopeProxyMode
名称的bean时,都会通过ScopedProxyFactoryBean
返回一个固定的CGLIB代理实例,当在该代理对象中调用类方法时,DynamicAdvisedInterceptor
会拦截调用,先通过BeanFactory.getBean
获取scopedTarget.testClassScopeProxyMode
名称的bean(即原始定义的bean),然后在该对象上进行实际的方法调用