Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using proxy-target-class="true" with Spring beans

Tags:

spring

jersey

Im using Jersey Rest and want a Jersey filter to have access to some spring beans.

however as I've discovered from other threads, Jersey does not obtain Spring beans if they are Java proxies as opposed to generated java proxies. I want to add the proxy-target-class="true"

What are the impacts of doing so and also can this just be set on a single bean or does it need to be set on all referenced beans?

like image 276
cdugga Avatar asked Mar 22 '13 10:03

cdugga


People also ask

What is spring proxy bean?

Whenever the beanB is requested from the container a new instance will be created. To solve these types of problem, Java spring framework provides the concept called proxy beans. For dependencies with less scope than a parent, the framework will create the proxies rather than creating actual objects.

What are the two types of proxies used in spring which are the limitations of the two proxy types?

Spring AOP is proxy based. Spring used two types of proxy strategy one is JDK dynamic proxy and other one is CGLIB proxy. JDK dynamic proxy is available with the JDK. It can be only proxy by interface so target class needs to implement interface.

How does proxy work in spring?

Spring AOP uses either JDK dynamic proxies or CGLIB to create the proxy for a given target object. (JDK dynamic proxies are preferred whenever you have a choice). If the target object to be proxied implements at least one interface then a JDK dynamic proxy will be used.

How does Cglib proxy work?

Under the covers, it uses ASM bytecode manipulation framework. Essentially, CGLIB dynamically generates a subclass to override the non-final methods of the proxied class. It is faster than the JDK dynamic proxy approach, which uses Java reflection. CGLIB cannot proxy a final class or a class with any final methods.


2 Answers

By setting proxy-target-class="true" you will be using CGLIB2 for your proxies, instead of jdk proxys.

The implications are the following, as described in the documentation:

  • final methods cannot be advised, as they cannot be overriden.

  • You will need the CGLIB 2 binaries on your classpath, whereas dynamic proxies are available with the JDK. Spring will automatically warn you when it needs CGLIB and the CGLIB library classes are not found on the classpath.

  • The constructor of your proxied object will be called twice. This is a natural consequence of the CGLIB proxy model whereby a subclass is generated for each proxied object. For each proxied instance, two objects are created: the actual proxied object and an instance of the subclass that implements the advice. This behavior is not exhibited when using JDK proxies. Usually, calling the constructor of the proxied type twice, is not an issue, as there are usually only assignments taking place and no real logic is implemented in the constructor.

Also, you should be able to make a "target-proxy" for a specific component by using

proxyMode=ScopedProxyMode.TARGET_CLASS 
like image 166
garst Avatar answered Sep 23 '22 06:09

garst


Forcing a CGLib-Proxy although the controller formally implements an interface (SpringBoot 1.2.3.RELEASE with Spring 4.1.6.RELEASE):

@Controller @Scope( proxyMode = ScopedProxyMode.TARGET_CLASS ) public class ServiceImpl implements ServiceIntf { .... } 

This enables valid and working @RequestMapping and @Transactional annotations

like image 24
Heri Avatar answered Sep 19 '22 06:09

Heri