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.");
}
}
-- 更新
我现在更改了代码并实现了切入点。使用此代码
@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。
我正在尝试设置 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.");
}
}
-- 更新
我现在更改了代码并实现了切入点。使用此代码
@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。