0
Я новичок в Spring AOP и аннотации. Я попытался написать простую программу, в которой используется Aspect. Я не могу понять, где я ошибся. Его не печатает то, что у меня есть в моем аспекте.Spring AOP - невозможно выполнить Aspect
package com.business.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy
@Configuration
public class PrintMain {
public static void main(String[] args) {
// Do I always need to have this. Can't I just use @Autowired to get beans
ApplicationContext ctx = new AnnotationConfigApplicationContext(PrintMain.class);
CheckService ck = (CheckService)ctx.getBean("service");
ck.print();
}
@Bean(name="service")
public CheckService service(){
return new CheckService();
}
}
package com.business.main;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class SimpleAspect {
@Around("execution(* com.business.main.CheckService.*(..))")
public void applyAdvice(){
System.out.println("Aspect executed");
}
}
package com.business.main;
import org.springframework.stereotype.Component;
@Component
public class CheckService{
public void print(){
System.out.println("Executed service method");
}
}
Выход: Выполненный метод обслуживания
Я ожидаю, чтобы напечатать то, что у меня есть в моем Аспект
мне пришлось сделать два изменения, чтобы сделать его работу 1) Реализовать интерфейс 2) добавить @ ComponentScan. Но я хотел бы знать, почему он не работает без интерфейса ... Я читал что-то, связанное с CGLIB, которое нельзя принудить с помощью аннотаций. Во-вторых, почему он не работает без @ ComponentScan – karthik
@karthik Поскольку вы просто используете Component, но Spring не используете его как bean-компонент, это означает, что ApplicationContext его не имеет. Когда ApplicationContext подключен, ему нужно знать, кто будет подключен как компонент. ApplicationContext не знает, нужен ли вам компонент или его использование, поэтому вам нужно использовать Xml или ComponentScan, чтобы сообщить Spring. Мне нужно, чтобы некоторые компоненты были подключены. – JonahCui
@karthik Мой английский не очень хорош. Пожалуйста, прости меня. – JonahCui