Spring AOP:传递日志参数

时间:2014-06-23 17:09:42

标签: spring dependency-injection aop aspectj aspect

我们正在使用org.springframework.beans.factory.BeanFactoryAware来运行一系列命令。系统的所有服务都使用一个服务来执行审计日志记录。此审计日志记录服务需要在BeanFactoryAware

的实现中设置的唯一标识符

现在,在每个函数调用中传递此唯一标识符。一种选择是使某种类型的上下文对象传递。最好不要这样做,因为这会使系统中不了解BeanFactoryAware系统的其他部分无法使用这些服务。

是否有一些实施更清洁解决方案的AOP方式?审计日志记录可以获取唯一标识符,而BeanFactoryAware和审计代码之间的所有代码都知道值的那个?


根据请求,这里有一些代码:

public class ChainRunner implements BeanFactoryAware
{
  public int runChain(String chainName, Object initParameters, int msgLinkId) throws Exception {
    OurContext ctx = createContext(initParameters);
    ctx.setMsgLinkId(msgLinkId);
    createChain(chainName).execute(ctx);    
    return retval;
  }
}

public class AServiceImpl implements AService
{
    private LoggingService logger;

    public LoggingService getLogger() {
        return logger;
    }

    public void setLogger(LoggingService logger) {
        this.logger = logger;
    }

    public void aMethod(object params, int msgLinkId)
    {
        // lots of code snipped
        logger().saveActionA( msgLinkId, otherParams);
    }
}

public interface LoggingService
{
  public void saveActionA(int msgLinkId, Object otherParams);
}

ChainRunner将msgLinkId添加到链的上下文中。每条消息都会将msgLinkId拉出上下文,并将其作为整数参数传递给服务,例如AServer.aMethod。最后,服务需要记录LoggerService上的活动,并传递有关正在记录的内容的参数,其中第一个参数是msgLinkId。

现在,所有服务都通过XML配置进行连接:

<bean id="loggerService" class="com.nowhere.LoggingServiceImpl"/>   

<bean id="aService" class="com.nowhere.AServiceImpl">
    <property name="logger"  ref="loggerService" />
</bean> 

所以问题是:是否可以使用AOP让msgLinkId跳转到LoggingService而不必通过多层服务传递它?

0 个答案:

没有答案