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),然后在该对象上进行实际的方法调用

本文深入探讨了Spring中Scope注解的作用,包括singleton和prototype两种行为,并详细解析了INTERFACE和TARGET_CLASS两种代理模式的工作原理。在INTERFACE模式下,Spring创建JDK动态代理,仅对接口方法生效;而在TARGET_CLASS模式下,使用CGLIB代理,对类方法进行拦截。了解这些知识有助于更好地理解和管理Spring Bean的生命周期。

7万+

被折叠的 条评论
为什么被折叠?



