Spring Boot AOP, AspecJ działa tylko w @Service

Spring Boot AOP, AspecJ działa tylko w @Service
LE
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0

Mój kod:

Kopiuj
@Aspect
@Configuration
public class UseAccessAspect {

    @Before("execution(* com.example.leszkaop.buisness.Business1.calculateSomething(..))")
    public void beforeCalculateMy(JoinPoint joinPoint){
        System.out.println("to działa");
    }

    @Before("execution(* com.example.leszkaop.buisness.Business2.calculateSomething(..))")
    public void beforeCalculateMy2(JoinPoint joinPoint){
        System.out.println("to nie działa");
    }
}



@Service
public class Business1 {
    public String calculateSomething(){
        return "xxxx";
    }
}


@Component("myBusiness2")
public class Business2 {
    public String calculateSomething(){
        System.out.println("Business2->calculateSomething()");
        return "yyyyyyy";
    }
}


public class LeszkaopApplication implements CommandLineRunner {

	@Autowired
	private Business1 business1;


	public static void main(String[] args) {
		SpringApplication.run(LeszkaopApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		System.out.println("dsadsadsa");
		business1.calculateSomething();

		Business2 business2 = new Business2();
		business2.calculateSomething();
	}

}

Jeśli zrobię z Business2 @Service i załącze przez @Autowired wszystko działa jak należy. Niestety bez tego nie chce.

DI
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:103
2

Czyli pytanie brzmi czemu nie działa, gdy stworzysz instację Buisness2 używając "new"? Jeśli tak to aspect nie jest aplikowany, ponieważ nie jest tworzone proxy springowe, lecz zwykła instancja klasy.

S9
Oho już zara @jarekr000000 przybędzie mówic o tym że to nie Java xD
jarekr000000
@scibi92: dzięki.
LE
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0
diamen napisał(a):

Czyli pytanie brzmi czemu nie działa, gdy stworzysz instację Buisness2 używając "new"? Jeśli tak to aspect nie jest aplikowany, ponieważ nie jest tworzone proxy springowe, lecz zwykła instancja klasy.

Tak tworzę przez new. Jak więc powinienem to zrobić?

DI
musisz wstrzyknąć tego beana - używając np. autowired :)
DI
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:103
0

I jeszcze ciekawostka. Takie podejście by zadziałało, gdybyś uzył AspectJ zamiast Aspektów Springowych. Aspecty Springowe wykorzystują proxy (więc musi być to bean), natomiast w przypadku AspectJ modyfikuje on kod bajtowy, więc nawet użycie instancji stworzonej przez "new" zadziała :P

LE
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0
diamen napisał(a):

I jeszcze ciekawostka. Takie podejście by zadziałało, gdybyś uzył AspectJ zamiast Aspektów Springowych. Aspecty Springowe wykorzystują proxy (więc musi być to bean), natomiast w przypadku AspectJ modyfikuje on kod bajtowy, więc nawet użycie instancji stworzonej przez "new" zadziała :P

To jak zrobić ten obiekt po Springowemu?

DI
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:103
0

tak samo jak Business1.

LE
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0
diamen napisał(a):

tak samo jak Business1.

Ale to jest zapięcie jako Service. Czyli na początku aplikacji samo robi się new Business1. A jak zrobić to w trakcie działania programu?

Znalazłem:

Business2 business2 = context.getBean(Business2.class);

w klasie która to wywółuje musi być:

@Autowired
private ApplicationContext context;

edytowany 1x, ostatnio: leszekjuniorjava

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.