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);
}
网友评论