spring 입문:출력 로그 의 인 스 턴 스 분석 자바 의 에이전트
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.테스트 실행:
이런 방식 은 다른 종류 에 도 똑 같이 적용 되 기 때문에 업무 논리 와 출력 로그 정보 코드 의 분 리 를 진정 으로 실현 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.