spring 입문:출력 로그 의 인 스 턴 스 분석 자바 의 에이전트

1.일반적인 로그 출력 방법
a.원래 프로그램 에서 로 그 를 작성 할 때 모든 업무 논리 적 방법 에서 로 그 를 기록 하 는 코드 를 작성 해 야 합 니 다.
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class TimeBook {

         private Logger logger = Logger.getLogger(this.getClass().getName());         //         
         public void doAuditing(String name) {
                  logger.log(Level.INFO, name + "       ....");
                  //         
                  ……   
                  logger.log(Level.INFO, name + "       ....");
         }
}

b.테스트 프로그램 작성:
import com.gc.action.TimeBook;
public class TestHelloWorld {
         public static void main(String[] args) {
                   TimeBook timeBook = new TimeBook();
timeBook.doAuditing("  ");
    }
}

c.테스트 프로그램 실행
위의 예제 에 서 는 로그 정 보 를 구체 적 인 업무 논리 에 추가 하 는 것 입 니 다.만약 프로그램 에 있 는 다른 코드 가 로그 출력 기능 이 필요 하 다 면 모든 프로그램 은 위 와 유사 한 코드 를 추가 해 야 합 니 다.이렇게 하면 프로그램 에 유사 한 로그 출력 코드 가 많이 존재 하여 매우 큰 결합 을 초래 할 수 있 습 니 다.어떤 방법 으로 업무 논리 와 출력 로그 의 코드 를 분리 할 수 있 습 니까?인터페이스 프로 그래 밍 을 통 해 이 문 제 를 개선 할 수 있다.
2.인터페이스 프로 그래 밍 을 통 해 로그 출력 실현
실현 방향 은 먼저 출근 심 사 를 수행 하 는 doAuditing()방법 을 추출 하여 인터페이스 로 만 든 다음 에 하나의 실체 류 를 통 해 이 방법 을 실현 하 는 것 이다.이 방법 에서 구체 적 인 출근 심사 업무 논 리 를 작성 한 다음 에 하나의 대리 류 를 통 해 로그 출력 을 하고 마지막 으로 테스트 프로그램 을 작성 하여 출력 결 과 를 보 는 것 이다.구체 적 인 절 차 는 다음 과 같다.
a.인터페이스 TimeBookInterface:
import org.apache.log4j.Level;

//              
public interface TimeBookInterface {
         public void doAuditing(String name);
}

b.인터페이스 구현 TimeBookInterface:
public class TimeBook implements TimeBookInterface {

public void doAuditing(String name) {
//         
……   
}
}

c.프 록 시 클래스 작성:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class TimeBookProxy {
private Logger logger = Logger.getLogger(this.getClass().getName());
private TimeBookInterface timeBookInterface;
     //           TimeBookInterface  ,        
     public TimeBookProxy(TimeBookInterface timeBookInterface) {
        this.timeBookInterface = timeBookInterface;
     }
          //      
          public void doAuditing(String name) {
                   logger.log(Level.INFO, name + "       ....");
                   timeBookInterface.doAuditing(name);   
                   logger.log(Level.INFO, name + "       ....");
          }
}

d.테스트 작성:
public class TestHelloWorld {
         public static void main(String[ ] args) {
           //          
TimeBookProxy timeBookProxy  = new TimeBookProxy(new TimeBook());
timeBookProxy .doAuditing("  ");

    }
}

e.테스트 실행:
앞의 로그 출력 과 비교 해 보면 이 예제 에서 구체 적 으로 출근 심 사 를 담당 하 는 업무 논리 코드 와 로그 정 보 를 담당 하 는 코드 가 분리 되 었 고 앞으로 인터페이스 TimeBookInterface 류 만 실현 하면 대리 류 TimeBookProxy 를 통 해 로그 정 보 를 출력 할 수 있 습 니 다.모든 종류 에 로그 정 보 를 출력 하 는 코드 를 쓰 지 않 아 도 됩 니 다.로그 정보의 코드 재 활용 을 실현 하 였 습 니 다.
3.자바 의 프 록 시 메커니즘 을 사용 하여 로그 출력
자바 가 제공 하 는 InvocationHandler 인 터 페 이 스 는 이러한 기능 을 실현 할 수 있 습 니 다.먼저 로그 정보의 프 록 시 클래스 를 작성 합 니 다.이 프 록 시 클래스 는 인터페이스 InvocationHandler 를 실현 한 다음 에 앞의 인 스 턴 스 와 유사 하 게 인 터 페 이 스 를 작성 하고 이 인 터 페 이 스 를 실현 합 니 다.실현 클래스 에서 구체 적 인 출근 심사 코드 를 작성 하고 마지막 으로 인터페이스 에 대해 테스트 클래스 를 작성 하여 테스트 결 과 를 봅 니 다.구체 적 인 절 차 는 다음 과 같다.
a.로그 정 보 를 만 드 는 프 록 시 클래스:
import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

//        InvocationHandler

public class LogProxy implements InvocationHandler {

    private Logger logger = Logger.getLogger(this.getClass().getName());
    private Object delegate;
    //      
    public Object bind(Object delegate) {
        this.delegate = delegate;
        return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().
getInterfaces(), this);
    }
    //      
    public Object invoke(Object proxy, Method method, Object[ ] args) throws Throwable {
        Object result = null;
        try {
                            //             
logger.log(Level.INFO, args[0] + "       ....");
              result = method.invoke(delegate, args);
                            logger.log(Level.INFO, args[0] + "       ....");
        } catch (Exception e){
            logger.log(Level.INFO, e.toString());
        }
        return result;
    }
}

b.인터페이스 TimeBookInterface:
import org.apache.log4j.Level;

//      

public interface TimeBookInterface {

         public void doAuditing(String name);

}

c.구현 인터페이스:
import com.gc.impl.TimeBookInterface;
public class TimeBook implements TimeBookInterface {
public void doAuditing(String name) {
//         
……   
}
}

d.테스트 코드:
public class TestHelloWorld {
         public static void main(String[ ] args) {
           //          
           LogProxy logProxy  = new LogProxy();
TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
timeBookProxy.doAuditing("  ");
    }
}

e.테스트 실행:
이런 방식 은 다른 종류 에 도 똑 같이 적용 되 기 때문에 업무 논리 와 출력 로그 정보 코드 의 분 리 를 진정 으로 실현 할 수 있다.

좋은 웹페이지 즐겨찾기