Spring AOP usa proxys dinámicos JDK o CGLIB para crear el proxy para un objeto objetivo dado. (Se prefieren los proxys dinámicos JDK siempre que tenga una opción).
Si el objeto de destino que se va a implementar implementa al menos una interfaz, se utilizará un proxy dinámico JDK. Todas las interfaces implementadas por el tipo de destino serán proxy. Si el objeto de destino no implementa ninguna interfaz, se creará un proxy CGLIB.
Si desea forzar el uso de proxy CGLIB (por ejemplo, para proxy cada método definido para el objeto de destino, no solo los implementados por sus interfaces), puede hacerlo. Sin embargo, hay algunos problemas a considerar:
Los métodos finales no pueden ser aconsejados, ya que no pueden ser anulados.
Necesitará los binarios CGLIB 2 en su classpath, mientras que los proxies dinámicos están disponibles con el JDK. Spring le avisará automáticamente cuando necesite CGLIB y las clases de la biblioteca CGLIB no se encuentren en el classpath.
El constructor de su objeto proxy se llamará dos veces. Esta es una consecuencia natural del modelo proxy CGLIB por el cual se genera una subclase para cada objeto proxy. Para cada instancia proxy, se crean dos objetos: el objeto proxy real y una instancia de la subclase que implementa el consejo. Este comportamiento no se exhibe cuando se utilizan servidores proxy JDK. Por lo general, llamar al constructor del tipo proxy dos veces no es un problema, ya que generalmente solo se realizan asignaciones y no se implementa una lógica real en el constructor.