Nie widzę błędu, spring prosta aplikacja

0
@Configuration
@EnableAspectJAutoProxy
public class Config {

    @Bean
    public CarProduction carProduction(@Value("bmw") String string){
        return new CarProduction(string);
    }

    @Bean
    public Spoiler spoiler(){
        return new AddSpoiler();
    }
}
@Aspect
public class AddSpoiler implements Spoiler {

    @Override
    @After("execution(* implementation.CarProduction.endProcessOfBuilding(..))")
    public void createSpoiler() {

        System.out.println("Creating spoiler for ...");
    }

}


@Component
public class CarProduction {

    private Bodywork bodywork;
    private Chassis chassis;
    private Engine engine;
    private Wheels wheels;

    public CarProduction( String typeOfFactory){

        CarFactory carFactory = new FactoryChooser().factory(typeOfFactory);
        this.bodywork = carFactory.createBodywork();
        this.chassis = carFactory.createChassis();
        this.engine = carFactory.createEngine();
        this.wheels = carFactory.createWheels();
    }
    
    //just for test aspect
    public void startProcessOfBuilding(){
        System.out.println("Production of car have started");
        buildCar();
    }
    private void buildCar(){

        chassis.createChassis();
        wheels.mountWheels();
        bodywork.mountBodywork();
        engine.createEngine();

    }
    //just for test aspect
    public void endProcessOfBuilding(){
        System.out.println("Process have finished sucesfully.");
    }
}

public class Test {

    public static void main(String[] args){

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        CarProduction carProduction1 = context.getBean(CarProduction.class);
        carProduction1.startProcessOfBuilding(); // <-- pomiędzy tą metodą, a następną powienien zostać wypisany text  klasy z adnotacją @Aspect
        carProduction1.endProcessOfBuilding();
    }
}

Moim problemem jest fakt, że aspekt się nie uruchamia nie widzę problemu - może zważywszy na porę. Jednakże żaden błąd nie wyskakuje. Kolejność adnotacji w springu jest istotna?Chciałbym zaznaczyć, że 'raczkuję' ze springiem ;)
Co robię źle ?

0

Po pierwsze, to twój komentarz że pomiędzy tymi metodami powinien być aspekt jest błędny, bo twój aspect zakłada wykonanie się po endProcessOfBuilding, czyli po wykonaniu się obu metod dopiero ;P

Po drugie, jeśli masz Intellij Ultimate (nie jestem pewien czy wersja Ultimate jest tu wymagana, ale jak coś to mają 30 dni triala), to znacząco pomaga w aspektach, bo przy tej metodzie createSpoiler w twoim aspekcie miałbyś z lewej strony okna edytora tekstowego taki różowy dziwny znaczek, który jak go klikniesz, pokazuje ci wszystkie metody, które zostaną przechwycone przez twój pointcut. Być może się okaże, że coś w tym wyrażeniu do pointcutu się walnąłeś.

0

Wydaje mi się, że to nie działa przez sposób, jaki aspekty działają ze springiem, a w tym konkretnym przypadku, na springowym proxy. Jeżeli wywołanie metody z aspektem odbywa się w ramach tej samej klasy, a zatem nie idzie żaden proxy call, aspekt się nie wywoła. Jeżeli jesteś pewien, że z Twoim syntaxem jest wszystko w porządku, spróbuj zmienić springowe @Aspect na aspekt z AspectJ (słowo kluczowe aspect).

Szybka edycja: Klasa z aspektem powinna być zannotowana przez @Component

0
dargenn napisał(a):

Wydaje mi się, że to nie działa przez sposób, jaki aspekty działają ze springiem, a w tym konkretnym przypadku, na springowym proxy. Jeżeli wywołanie metody z aspektem odbywa się w ramach tej samej klasy, a zatem nie idzie żaden proxy call, aspekt się nie wywoła. Jeżeli jesteś pewien, że z Twoim syntaxem jest wszystko w porządku, spróbuj zmienić springowe @Aspect na aspekt z AspectJ (słowo kluczowe aspect).

Szybka edycja: Klasa z aspektem powinna być zannotowana przez @Component

  1. Wywołanie metody nie idzie wewnątrz tej samej klasy.
  2. Ma utworzenie beana w klasie konfiguracyjnej
1

Czy adnotacja @Override nadpisuje adnotacje @Aspect?
Po takich modyfikacjach ;

@Aspect
public class AddSpoiler /*implements Spoiler */{ //<--- przestałem implementowac interfejs

    //@Override <--- Dlaczego teraz działa?
    @Before("execution(* implementation.CarProduction.endProcessOfBuilding(..))")
    public void createSpoiler() {

        System.out.println("Creating spoiler for ...");
    }

}
@Configuration
@EnableAspectJAutoProxy
public class Config {

    @Bean
    public CarProduction carProduction(@Value("bmw") String type){
        return new CarProduction(type);
    }

    @Bean
    public AddSpoiler spoiler(){ //<-- nie zwracam beana z interfejstu tylko od czystej implementacji klasy
        return new AddSpoiler();
    }
}

porada pojawia się ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1