Spring CGLIB动态代理

66 阅读1分钟

UserService接口

public interface UserService {

    public Boolean login(String username, String password);

    public void logout();
}

UserServiceImpl

public class UserServiceImpl implements UserService {

    @Override
    public Boolean login(String username, String password) {
        System.out.println("login...");
        if("admin".equals(username) && "password".equals(password)) {
            return true;
        }
        return false;
    }


    @Override
    public void logout() {
        System.out.println("logout...");
    }
}

UserServiceCGLIBProxy代理类

import org.springframework.cglib.proxy.MethodInterceptor; //引包别引入错了
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class UserServiceCGLIBProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        long begin = System.currentTimeMillis();
        Object returnVal = proxy.invokeSuper(obj, args);
        long end = System.currentTimeMillis();
        System.out.println("use time: "+(end-begin)+" ms");
        return null;
    }
}

测试类

public class UserTest {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new UserServiceCGLIBProxy());
        UserService userServiceProxy = (UserService) enhancer.create();

        //System.out.println(userServiceProxy); //根据此名称推测底层是否使用了CGLIB动态代理

        Boolean b = userServiceProxy.login("admin", "123");
        System.out.println(b?"login ok":"login fail");

        userServiceProxy.logout();
    }

}

image.png 出现报错解决:

1691055894178.jpg

1691055931454.jpg 添加如下:

1691055880601.jpg