1.动态代理的作用
动态代理的作用是实现AOP功能
2.代理实现功能描述
本次演示动态实现功能:为已经具有登录功能的方法增加权限控制
3.CGLIB动态代理和JDK动态代理区别
JDK动态代理是jdk自带功能,只能针对接口进行代理
CGLIB动态代理是spring功能,针对没有接口的类进行代理
4.动态代理步骤
* 实现动态代理的步骤
1.创建目标类,不需要接口,与jdk代理的区别
2.创建MethodInterceptor接口的实现类,在invoke方法中完成要代理类的功能
2.1.调用目标方法
2.2 增强功能
3.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型
5.代码实现
5.1 创建具有登录功能的类
public class LoginService {
public boolean login(String username, String password) {
//登录目标方法,验证用户名和密码是否正确
System.out.println("执行目标类目标方法,验证用户名和密码是否正确");
if("wensheng".equals(username) && "123456".equals(password)){
System.out.println("用户名和密码验证正确");
return true;
}else{
System.out.println("用户名和密码验证错误");
return false;
}
}
}
5.2创建MethodInterceptor接口的实现类,在invoke方法中完成要代理类的功能
package com.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibDynamicProxy implements MethodInterceptor {
private Object target = null;
//创建代理对象
public Object getProxyInstance(Object target) {
//给目标对象赋值
this.target = target;
//声明增强类类型
Enhancer enhancer = new Enhancer();
//设置被代理的类字节码,CGLIB根据字节码生成被代理类子类
enhancer.setSuperclass(this.target.getClass());
//设置要代理的拦截器,回调函数,即一个方法拦截
enhancer.setCallback(this);
//创建代理对象实例
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object res = null;
res = method.invoke(target,objects);//执行目标方法,即调用目标方法
//以下为增强功能方法
if(res != null){
boolean b = (boolean)res;
//如果b为true,表示用户名密码都在正确,否则表示不正确
//如果用户名密码都正确,则去进行权限验证,否则不进行验证直接返回false
if(b){
//此处进行权限验证的方法,具体方忽略,权限正确返回true,权限错误返回false
System.out.println("验证当前用户是否有登录权限");
res = true;
}else{
res = false;
}
}
return res;
}
}
5.3使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型
package com.cglib;
import com.jdk.service.impl.LoginService;
/**
* 实现cglib动态代理的步骤
* 1.创建目标类,不需要接口,与jdk代理的区别
* 3.创建MethodInterceptor接口的实现类,在invoke方法中完成要代理类的功能
* 3.1.调用目标方法
* 3.2 增强功能
* 4.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型
*/
public class main {
public static void main(String[] args) {
LoginService loginService = new LoginService();
CglibDynamicProxy cglib = new CglibDynamicProxy();
LoginService proxy = (LoginService) cglib.getProxyInstance(loginService);
boolean b = proxy.login("wensheng","123456");
System.out.println(b);
}
}