AOP Proxies:-
Spring AOP defaults to using standard JDK dynamic proxies for AOP proxies. This
enables any interface (or set of interfaces) to be proxied.
Spring AOP can also use CGLIB proxies. This is necessary to proxy classes,
rather than interfaces. CGLIB is used by default if a business object does not
implement an interface. As it is good practice to program to interfaces rather
than classes, business classes normally will implement one or more business
interfaces. It is possible to force the use of CGLIB, in those (hopefully rare)
cases where you need to advise a method that is not declared on an interface, or
where you need to pass a proxied object to a method as a concrete type.
Mechanism of AOP proxies:-
Spring AOP is proxy-based. It is vitally important that you grasp the semantics
of what that last statement actually means before you write your own aspects or
use any of the Spring AOP-based aspects supplied with the Spring Framework.
public class Simple implements Pojo {
public void foo() {
// this next method invocation is a direct call on the this reference
this.bar();
}
public void bar() {
// some logic...
}}
If you invoke a method on an object reference, the method is invoked directly on that object reference, as can be seen below.
public class Main {
public static void main(String[] args) {
Pojo pojo = new SimplePojo();
// this is a direct method call on the pojo reference
pojo.foo();
}}
Things change slightly when the reference that client code has is a proxy.
public class Main {
public static void main(String[] args) {
ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.addInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());
Pojo pojo = (Pojo) factory.getProxy();
// this is a method call on the proxy!
pojo.foo();
}}
The key thing to understand here is that the client code inside the main(..) of the Main class has a reference to the proxy. This means that method calls on that object reference will be calls on the proxy, and as such the proxy will be able to delegate to all of the interceptors (advice) that are relevant to that particular method call.