美文网首页设计模式
cglib动态代理(需要cglib.jar)

cglib动态代理(需要cglib.jar)

作者: jsjack_wang | 来源:发表于2018-01-17 13:39 被阅读0次
1.原理
cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理
API介绍:
    Enhancer enhancer = new Enhancer(); // cglib增强类
    enhancer.setSuperclass(target.getClass());  // 设置目标类
    enhancer.setCallback(this); // 设置委托对象
    return (T) enhancer.create();   // 创建代理对象
    
    MethodInterceptor 方法拦截接口
2.具体实现
2.1 User.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    private String password;
}
2.2 委托类
public class UserDaoImpl implements IUserDao {
    @Override
    public void saveUser(User user) {
        System.out.println("UserDaoImpl save user.");
    }

    @Override
    public int updateUser(User user) {
        System.out.println("UserDaoImpl update user.");
        return 0;
    }
}
2.3 代理类
public class UserCglibProxy<T> implements MethodInterceptor {

    private T target;

    public T proxy(T target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return (T) enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("ProxyMethod before.");
        Object result = methodProxy.invoke(target, objects);
        System.out.println("ProxyMethod after.");
        return result;
    }
}
3.测试
@Test
public void testCglib() {
    User user = new User();
    UserDaoImpl userDao = new UserDaoImpl();
    UserDaoImpl userDaoProxy = new UserCglibProxy<UserDaoImpl>().proxy(userDao);
    userDaoProxy.saveUser(user);
}

相关文章

网友评论

    本文标题:cglib动态代理(需要cglib.jar)

    本文链接:https://www.haomeiwen.com/subject/qtxuoxtx.html