WebHU - Programozási kérdések és válaszok

SpringAOP: Hogyan képes a Spring a gyár által létrehozott proxy objektumot?

Új vagyok az AOP-ban, és lassan elolvasom és megtanulom a SpringAOP-t és az AspectJ-t.

Nem várt példával találkoztam, hogy egy olyan objektumot, amelyet nem babként, hanem egy babként létrehozott gyár hoz létre, az én szempontommal közelítenek, míg én csak azokat az objektumokat várom, amelyeket rugót a SpringAOP vonatkozó szempontjaival kell helyettesíteni.

Hogyan tudja a spring tudni, hogy egy olyan objektumot proxyzzon, amelyet egy gyár hoz létre, amelyet a springnél regisztráltak? Ez azt jelenti, hogy honnan tudná a tavasz, hogy a saját gyáram valójában egy gyár, és a DogShelter.getAngryDog() által visszaadott objektum egy új objektum, amelyet proxyval kell burkolni, ahelyett, hogy valamilyen meglévő AngryDog_, amelyet korábban már becsomagoltak egy aspektusproxyval?

Íme a kód:

Tárgy:

public class AngryDog extends Dog {
    @Override
    public void play() {
        System.out.println("AngryDog->play()");
        bark();
        bite();
    }

    @Override
    public void bark() {
        System.out.println("AngryDog->bark()");
    }

    @Override
    public void bite() {
        System.out.println("AngryDog->bite()");
    }
}

Gyár:

public class DogShelter {
    public AngryDog getAngryDog(){
        return new AngryDog();
    }
}

Vonatkozás:

@Aspect
public class BeforeAllDogMethodsAspect {

    @Before("execution(* com.demos.dogs.*.*(..)))")
    public void doAccessCheck() {
        System.out.println("SpringAOP aspect called!");
    }

}

Tavaszi konfig:

/** DogConfig spring configuration */
@EnableAspectJAutoProxy
@Configuration
public class DogConfig {

    @Bean
    public AngryDog dog() {
        return new AngryDog();
    }

    @Bean
    public DogShelter dogShelter(){
        return new DogShelter();
    }

    @Bean
    public BeforeAllDogMethodsAspect beforeAngryDogBitesExample(){
        return new BeforeAllDogMethodsAspect();
    }
}

felhívás:

foo(){
        System.out.println("----------------");
        System.out.println("Getting a dog from locally created dog shelter. And playing with it");
        DogShelter locallyCreatedDogShelter = new DogShelter();
        AngryDog dogFromLocalShelter = locallyCreatedDogShelter.getAngryDog();
        dogFromLocalShelter.play();

        System.out.println("----------------");
        System.out.println("Getting a dog from autowired dog shelter. And playing with it");
        AngryDog dogFromAutoWiredDogShelter = autowiredDogShelter.getAngryDog();
        dogFromAutoWiredDogShelter.play();
}

Kimenet :

 ----------------
 Getting a dog from locally created dog shelter. And playing with it
 AngryDog->play()
 AngryDog->bark()
 AngryDog->bite()
 ----------------
 Getting a dog from autowired dog shelter. And playing with it
 SpringAOP aspect called!
 AngryDog->play()
 AngryDog->bark()
 AngryDog->bite()
18.10.2015

Válaszok:


1

Meg kell jelenítenie a metódus nevét a saját aspektusában. Ellenkező esetben nem tudja, melyik módszert hallgatják el.

A kérdéseddel kapcsolatban: Valószínűleg a getAngryDog() metódus, és nem a play() metódus van elfogva.

18.10.2015
  • A hozzáadott metódusnév elfogás alatt áll. Pontosan azt gondolta, hogy getAngryDog() elfogták. 19.10.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..