我正在尝试设置Spring AOP,将一些日志记录方法注入到我的业务逻辑中。 但只执行第一个方面(uiStarted)。以下所有(例如uicreateMovie)都不是。第二个目标是同一类中的类似方法。
LoggingBean
@Aspect
@Component
public class LoggingBean {
private final Logger mLogger = Logger.getLogger(LoggingBean.class);
//This one works
@Before("execution(* de.rocketscienceengineering.springexampleproject.view.UI.startTheEngines(..))")
public void uiStarted(JoinPoint joinp) {
mLogger.info("Spring Log: the program started.");
}
//This one does not work
@Before("execution(* de.rocketscienceengineering.springexampleproject.view.UI.createMovie(..))")
public void uicreateMovie(JoinPoint joinp) {
mLogger.info("Spring Log: trying to create movie.");
}
}
- 更新
我现在更改了代码并实现了切入点。使用此代码
@Pointcut("execution(public * startTheEngines(..))")
public void startTheEngines() {
@Before("de.rocketscienceengineering.springexampleproject.view.UI.startTheEngines()")
public void uiStarted(JoinPoint joinp) {
mLogger.error(">>>>>>>> Spring Log: before public methods");
}
我得到了正确的日志!
但是,如果我现在实现第二种方法,而不触及第一种方法
@Pointcut("execution(public * test(..))")
public void test() {
startTheEngines();
}
@Pointcut("execution(public * startTheEngines(..))")
public void startTheEngines() {
@Before("de.rocketscienceengineering.springexampleproject.view.UI.startTheEngines()")
public void uiStarted(JoinPoint joinp) {
mLogger.error(">>>>>>>> Spring Log: before public methods");
}
@Before("de.rocketscienceengineering.springexampleproject.view.UI.test())")
public void uiStartedtest(JoinPoint joinp) {
mLogger.error("<<<<<<<< Spring Log: second log");
}
它只记录第二个日志并忘记第一个日志。为什么呢?
答案 0 :(得分:1)
Spring AOP为您的bean创建代理并注入代理。这意味着它只适用于从这个bean外部调用的方法(因为它必须通过该代理调用!)。
如果您需要它可以使用任何方法尝试AspectJ。