溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java Proxy代理的日志記錄和管理

發布時間:2025-02-12 09:48:22 來源:億速云 閱讀:98 作者:小樊 欄目:編程語言

Java Proxy代理在日志記錄和管理中的應用可以通過靜態代理和動態代理兩種方式實現。

靜態代理實現日志記錄

靜態代理需要在編譯時明確指定代理類。下面是一個簡單的示例:

// 定義接口
public interface UserService {
    void addUser(String name);
}

// 目標類
public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("User added: " + name);
    }
}

// 代理類
public class UserServiceProxy implements UserService {
    private final UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void addUser(String name) {
        System.out.println("[LOG] Adding user...");
        userService.addUser(name);
        System.out.println("[LOG] User added.");
    }
}

// 測試代碼
public class StaticProxyDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceProxy(new UserServiceImpl());
        userService.addUser("Alice");
    }
}

動態代理實現日志記錄

動態代理在運行時動態生成代理類,更加靈活。下面是一個使用JDK動態代理的示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 定義接口
public interface UserService {
    void addUser(String name);
    void deleteUser(String name);
}

// 實現類
public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("Added user: " + name);
    }

    @Override
    public void deleteUser(String name) {
        System.out.println("Deleted user: " + name);
    }
}

// InvocationHandler實現類
public class UserServiceInvocationHandler implements InvocationHandler {
    private final Object target;

    public UserServiceInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After method: " + method.getName());
        return result;
    }
}

// 測試代碼
public class DynamicProxyDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserService proxyInstance = (UserService) Proxy.newProxyInstance(
            userService.getClass().getClassLoader(),
            userService.getClass().getInterfaces(),
            new UserServiceInvocationHandler(userService)
        );
        proxyInstance.addUser("John Doe");
        proxyInstance.deleteUser("John Doe");
    }
}

使用AOP進行日志記錄

AOP(面向切面編程)可以通過自定義注解和切面實現更靈活的日志記錄和管理:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {
    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Pointcut("@annotation(com.example.SyStemLog)")
    public void logPointcut() {
    }

    @Around("logPointcut()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result;
        try {
            logger.info("Method {} is called", joinPoint.getSignature().getName());
            result = joinPoint.proceed();
            logger.info("Method {} execution completed", joinPoint.getSignature().getName());
        } catch (Exception e) {
            logger.error("Method {} execution failed", joinPoint.getSignature().getName(), e);
            throw e;
        }
        return result;
    }
}

// 自定義注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SyStemLog {
    String value() default "";
    String description() default "";
    String moduleName() default "";
    String businessName() default "";
}

通過上述方法,可以在不修改業務類代碼的情況下,實現日志記錄和管理功能。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女