OP는 일반 자바 프록시를 사용하는 것이 가장 좋은 해결책이라는 의견을 언급합니다. 현재 코드는 정적 메소드로 구현됩니다. Java 프록시를 사용하기 위해서는 로거 클래스를 인터페이스로 재 작성해야합니다. 이런 식으로 뭔가 :
public interface SomeActionLogger
{
void logSomeAction();
void logSomeOtherAction();
// etc..
}
당신은 다음 만들고, 구체적인 구현 그런 다음 가질 수
public class SystemOutActionLogger implements SomeActionLogger
{
public void logSomeAction() {
System.out.println (msg(SOME_ACTION));
}
}
자바 프록시는
class DelayAfterInvocationHandler implements InvocationHandler
{
private Object delegate;
private int duration;
DelayAfterInvocationHandler(Object delegate, int duration)
{
this.delegate = delegate;
this.duration = duration;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object returnValue = method.invoke(delegate, args);
Thread.sleep(duration);
// you may want to catch InterruptedEception
return returnValue;
}
}
이-소위하지의 일부를 숨길 수있는 SomeActionLogger
인터페이스를 포장 예쁜 프록시 코드를 사용하면 로거를 래핑하여 지연을 생성하는 메소드를 가질 수 있습니다.
public ActionLogger addDelay(SomeActionLogger logger, int delay)
{
return (ActionLogger)Proxy.newProxyInstance(
impl.getClass().getClassLoader(),
new Class[] { SomeActionLogger.class },
new DelayAfterInvocationHandler(logger, delay));
}
그래서 당신은 다음
DelayInvocationHandler
로깅 인터페이스에 직교 것을
SomeActionLogger log = addDelay(new SystemOutActionLogger(), 2000);
주 쓰기 - 그것은 어떤 인터페이스에 지연을 추가 할 수 있습니다. 그런 다음 일반 포장 방법을 다음과 같이 만들 수 있습니다.
public <T> T addDelay(T delegate, int delay, Class<T> interfaceType)
{
return (T)Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),
new Class[] { type },
new DelayAfterInvocationHandler(delegate, delay));
}
나는 측면을 싫어하는 것과 마찬가지로, 이것이 바로 그들이하는 일입니다. 애스펙트는 표준 Java 구현의 일부가 아니기 때문에 별도의 컴파일러를 사용해야합니다. [AspectJ] (http://www.eclipse.org/aspectj/)는 Java의 공통된 부분입니다. –
저는 aspect에 대한 아이디어가 마음에 들었고, 저는 Spring의 측면에 대해서도 배웠습니다. 그러나 나는 아직이 해결책을 스스로하기에 충분한 지식이 없지만 그 일을 끝내야한다. 적절한 코드를 가지고 있습니까? 아니면 최소한 sscce입니까? 의존성이 해결되어야 하는가? – Roman
애스펙트에는 편집기에 표시되는 코드가 반드시 실행중인 코드 일 필요는 없다는 단점이 있습니다. –