我正在试着理解cglib。但是下面的结果让我很困惑。有人能帮我解释一下吗?
使用@Scope时(值=“原型”,代理模式=作用域代理模式.目标类)
@Configuration
@Data
@Scope(value = "prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class DemoCGLIB {
private int counter;
public static void main(String... strings) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(DemoCGLIB.class);
DemoCGLIB bean1 = context.getBean(DemoCGLIB.class);
bean1.setCounter(2);
System.out.println(bean1.getCounter());
DemoCGLIB bean2 = context.getBean(DemoCGLIB.class);
System.out.println(bean2.getCounter());
}
}
创建了一个单例bean示例,bean 1和bean 2引用同一个示例,但即使在setCounter(2)之后,counter也是0
使用@Scope(可配置的BeanFactory.SCOPE_PROTOTYPE)时
@Configuration
@Data
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DemoCGLIB {
private int counter;
public static void main(String... strings) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(DemoCGLIB.class);
DemoCGLIB bean1 = context.getBean(DemoCGLIB.class);
bean1.setCounter(2);
System.out.println(bean1.getCounter());
DemoCGLIB bean2 = context.getBean(DemoCGLIB.class);
System.out.println(bean2.getCounter());
}
}
bean 1和bean 2不同。未创建单例示例。
1条答案
按热度按时间unftdfkk1#
在使用@Scope的第一个测试中(值=“原型”,代理模式=范围代理模式.目标类)
正在使用CglibAopProxy。setter/getter在代理对象中完成。
当打印出咖啡豆时,有
在使用@Configuration的第二个测试中,创建了某种cglib代理(可能是为了处理Full模式与Lite模式)。它不是AOP代理。更新是在真实的对象上完成的。
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)使它每次都是唯一的。更新是在真实的对象中完成的。因此每个对象可以有不同的值。