• Archiv der Kategorie: Spring

Spring AOP Proxy – Auf ein durch Proxy vertretenes Objekt zugreifen

Spätestens sobald eine Spring-Component mit einer Annotation für Caching, Transaktionen oder AOP versehen ist, baut Spring einen Proxy davor.

!Spring baut keinen Proxy for ein jedes dependency injected Bean!

Die Referenz auf das Object, das man sich von Spring „autowiren“ liess, z.B.

@Autowired
private MeineSpringComponent meineSpringComponent;

lässt ist dann der Proxy.
Um auf das reale Objekt zuzugreifen ist folgender Code nötig:

    public static <T> T getTargetObject(Object proxy)  {
        if (AopUtils.isCglibProxy(proxy) || AopUtils.isAopProxy(proxy)) {
            try {
                return (T) ((Advised) proxy).getTargetSource().getTarget();
            } catch (Exception e) {
                e.printStackTrace();
                fail(e.getMessage());
                return null;
            }
        } else {
            return (T) proxy;
        }
    }

Der code prüft zuerst ob es sich um einen Spring-Proxy handelt und gibt, wenn es so ist das dahinter stehende Objekt zurück, wenn nicht jedoch das Input-Objekt selbst.

Wenn man nun also z.B. via Reflection auf ein Feld von meineSpringComponent zugreifen möchte tut man das so:

org.springframework.test.util.ReflectionTestUtils.setField(AOPUtilsHelper.getTargetObject(meineSpringComponent), „nameDesFelds“, „neuer Wert des Feldes“);
[/java]

Reference: Transactions Caching and  AOP – Understanding Proxy Usage in-Spring

Schließen