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

0

Mój kod:

@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.

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.

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ć?

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

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?

0

tak samo jak Business1.

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;

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