我们正在使用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而不必通过多层服务传递它?