Ist es möglich, eine Spring Bean aufzuheben?

Lesezeit: 2 Minuten

Ich habe eine Frühlingsbohne, sagen wir:

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class AImpl implements A {

     public void setSomeDependency(D dependency) {
         // This setter DOES NOT BELONG to interface A
     }
}

<bean id="aImpl" class="AImpl"/>

Jetzt möchte ich die Integration testen, aber zuerst muss ich die Abhängigkeit nachahmen D, weil es zu viel macht. Seit der AImpl implementiert eine Schnittstelle und enthält eine transaktionale Annotation, der generierte Proxy ist nur mit der Schnittstelle kompatibel A, damit ich das machen kann:

@Inject @Named("aImpl")
private A a;

aber kann nicht:

@Inject @Named("aImpl")
private AImpl a;

Daher kann ich meine Abhängigkeit nicht verspotten.

Bitte beachten Sie, dass das Hinzufügen void setSomeDependency(D dependency) Schnittstelle A ist keine Option, da sie keine geschäftliche Bedeutung hat. Weder verwendet es die proxy-target-class="true", da es viele andere Beans zerstört (dieses Attribut betrifft alle Beans im Kontext).

Gibt es eine Möglichkeit, den Proxy der injizierten Bohne aufzuheben? A, damit ich es werfen konnte AImpl?

  • mögliches Duplikat von Casting eines Spring’s Proxy-Objekts in die tatsächliche Laufzeitklasse

    – skaffman

    14. November ’11 um 13:39

  • @skaffman: Danke für den Hinweis, ich habe diese Frage zu den FAQ zum Spring-Tag hinzugefügt

    – Tomasz Nurkiewicz

    14. November ’11 um 13:43

Ist es moglich eine Spring Bean aufzuheben
Tomasz Nurkiewicz

Versuche dies:

if(AopUtils.isAopProxy(a) && a instanceof Advised) {
    Object target = ((Advised)a).getTargetSource().getTarget();
    AImpl ai = (AImpl)target;
}

Bonus: In Scala verwende ich die folgende äquivalente Funktion für denselben Zweck:

def unwrapProxy(a: AnyRef) = a match {
    case advised: Advised if(AopUtils.isAopProxy(advised)) => 
                            advised.getTargetSource.getTarget
    case notProxy => notProxy
}

  • Danke, du hast mich wirklich gerettet. Übrigens, ich war gerade zum ersten Mal in Oslo, jetzt frage ich mich nicht, warum du so viel Zeit auf SO verbringst (nicht für ungut gemeint, aber das Wetter ist nicht ermutigend) 🙂

    – MaDa

    14. November ’11 um 12:56

  • Froh, dass ich helfen konnte. Dein Kommentar hat mir so gut gefallen, dass ich ihn sogar auf meiner Profilseite zitiert habe ;-).

    – Tomasz Nurkiewicz

    14. November ’11 um 13:22

Mit der Einführung von Spring 4.2.RC1 gibt es jetzt eine dedizierte Utility-Klasse in der spring-test Modul, das diesen Fall für Sie übernimmt.

Die Klasse heißt AopTestUtils und bietet die Methoden:

  • getTargetObject (entpackt nur den Proxy der obersten Ebene)
  • getUltimateTargetObject (Entpackt mehrere Ebenen von Proxys, falls vorhanden).

Sehen Sie sich die entsprechenden verpflichten sowie die jeweiligen Ausgabe.

  • Vielen Dank für die Bereitstellung einer aktualisierten Antwort. Dies ist für die meisten Menschen eine bessere Lösung, da sie viel weniger Logik erfordert.

    – GrünKiwi

    29. Juli ’19 um 0:24

.

357180cookie-checkIst es möglich, eine Spring Bean aufzuheben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy