Spring AOP 没有注入所有方面

Spring AOP is not injecting all the aspects

我正在尝试设置 Spring AOP 以将一些日志记录方法注入到我的业务逻辑中。 但只有第一个方面 (uiStarted) 被执行。以下所有内容(例如 uicreateMovie)都不是。第二个针对相同 class.

中的类似方法

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.");
    }
}

LoggingBean https://github.com/tkupek/SpringExampleProject/blob/master/src/main/java/de/rocketscienceengineering/springexampleproject/util/LoggingBean.java

UI https://github.com/tkupek/SpringExampleProject/blob/master/src/main/java/de/rocketscienceengineering/springexampleproject/view/UI.java

-- 更新

我现在更改了代码并实现了切入点。使用此代码

@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");
}

它只记录了第二个日志而忘记了第一个。为什么?

Spring AOP 为您的 bean 创建代理并注入代理。这意味着它仅适用于从该 bean 外部调用的方法(因为它必须通过该代理调用!)。

如果您需要它为任何方法工作,请尝试 AspectJ。