Diego Moreira
Diego Moreira

Reputation: 41

Spring - How to know if cglib or jdk dynamic proxy was applied to a bean

Im studying for the Spring Core cert exam, and i'm doing some testing of the framework.

I'd like to know if there is a way to know if a Bean was proxied by CGLIB or the JDK library.

I already know the basic concepts like if you declare a Bean using the interface Spring will use the JDK to proxy it (unless you tell it otherwise). And if you declare a bean directly on a class it will proxy it by inheritance using CGLIB.

What I would like to know is what should I look for while debugging to check which library was used.

Given the following code, when I debug it, I dont see any difference in the instances of the beans created. I was expecting to see something like ConcreteBean$CGLIB in the bean that has no interface...

EDIT: i now understand that proxies are only created by spring when functionality needs to be added by a PostProcessor, but still, i'd like to know what to look for in the debugger to find if CGLIB was applied or not.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MainConfig.class)
public class ProxiesTest {

    @Autowired
    RandomBean randomBean;
    @Autowired
    ConcreteBean concreteBean;

    public void setUp() {
    }

    @Test
    public void randomBeanTest() {
        randomBean.doSomething();
    }
    @Test
    public void concreteBeanTest() {
        concreteBean.doSomething();
    }
}

public class ConcreteBean {
    public void doSomething() {
        String concreteBean = "hello";
    }

    @PreDestroy
    public void destroy() {
        System.out.print("ConcreteBean Destroy");
    }
}

public interface RandomBean {

    public void doSomething();

    public void destroy();
}
public class RandomBeanImpl implements RandomBean {

    @Autowired
    ApplicationContext context;

    public void doSomething() {
        context.getParentBeanFactory();
    }

    public void destroy() {
        System.out.print("RandomBean destroyed");
    }
}
@Configuration
@ComponentScan(basePackages = "com.certification.postprocessors")
public class MainConfig {

    @Bean
    public ConcreteBean concreteBean(){
        return new ConcreteBean();
    }

    @Bean
    public RandomBean randomBean() {
        return new RandomBeanImpl();
    }
}

Upvotes: 2

Views: 1485

Answers (1)

Diego Moreira
Diego Moreira

Reputation: 41

When a bean is wrapped by a Spring CGLIB proxy it states $$EnhancerBySpringCGLIB.

A JDK proxy is shown as $Proxy

It looks like this in the debugging console

Upvotes: 2

Related Questions