Spring AOP没有注入所有方面

时间:2015-06-06 08:10:58

标签: java spring aop spring-aop

我正在尝试设置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.");
    }
}

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您需要它可以使用任何方法尝试AspectJ。