spring 如何正确使用cglib

5q4ezhmt  于 2022-12-17  发布在  Spring
关注(0)|答案(1)|浏览(148)

我正在试着理解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不同。未创建单例示例。

unftdfkk

unftdfkk1#

在使用@Scope的第一个测试中(值=“原型”,代理模式=范围代理模式.目标类)
正在使用CglibAopProxy。setter/getter在代理对象中完成。

xxxBean$$EnhancerBySpringCGLIB
    CGLIB$CALLBACK
        CglibAopProxy$DynamicAdvisedInterceptor

当打印出咖啡豆时,有

demoCGLIB : class com.example.demo.bean.DemoCGLIB$$EnhancerBySpringCGLIB$$d34f96ce 
scopedTarget.demoCGLIB : class com.example.demo.bean.DemoCGLIB$$EnhancerBySpringCGLIB$$ce3d6945

在使用@Configuration的第二个测试中,创建了某种cglib代理(可能是为了处理Full模式与Lite模式)。它不是AOP代理。更新是在真实的对象上完成的。

xxxBean$$EnhancerBySpringCGLIB
        CGLIB$CALLBACK
            ConfigurationClassEnhancer$BeanMethodInterceptor                
            ConfigurationClassEnhancer$BeanFactoryAwareMethodInterceptor

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)使它每次都是唯一的。更新是在真实的对象中完成的。因此每个对象可以有不同的值。

相关问题