springaop:为日志传递参数
我们使用org.springframework.beans.factory.BeanFactoryAware来运行一系列命令。系统的所有服务都使用一个服务来执行审核日志记录。此审核日志记录服务需要在我们的BeanFactoryAware实现中设置的唯一标识符 现在,这个唯一标识符正在每个函数调用中传递。一种选择是使用某种类型的上下文对象进行传递。最好不要这样做,因为这会降低系统中不了解BeanFactoryAware系统的其他部分对服务的可用性 是否有某种AOP方法可以实现更清洁的解决方案?审计日志可以在BeanFactoryAware和审计代码之间的所有代码都不知道该值的情况下获取唯一标识符 根据请求,以下是一些代码:springaop:为日志传递参数,spring,dependency-injection,aop,aspectj,aspect,Spring,Dependency Injection,Aop,Aspectj,Aspect,我们使用org.springframework.beans.factory.BeanFactoryAware来运行一系列命令。系统的所有服务都使用一个服务来执行审核日志记录。此审核日志记录服务需要在我们的BeanFactoryAware实现中设置的唯一标识符 现在,这个唯一标识符正在每个函数调用中传递。一种选择是使用某种类型的上下文对象进行传递。最好不要这样做,因为这会降低系统中不了解BeanFactoryAware系统的其他部分对服务的可用性 是否有某种AOP方法可以实现更清洁的解决方案?审计
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,而无需将其传递到多个服务层?您的日志服务是否有一种方法可以接受日志对象并将id封装在其中?是否有一些源代码可以更好地传达您的情况和需求?我想看看你提到的对象是如何一起玩的,以及唯一ID存储在哪里,因为知道ID的对象就是你需要从中检索它的对象。这听起来在某个方面很容易做到,但请给我们一些开始。