一、动态代理
1.1 参考
https://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
二、静态代理
2.1 接口
public interface Stu {
public void getName();
public void getAge();
}
2.2 接口的实现
public class StuImp implements Stu{
@Override
public void getName() {
System.out.println("获得姓名");
}
@Override
public void getAge() {
System.out.println("获得年龄");
}
}
2.3 静态代理
public class StuDelget {
StuImp stu;
public StuDelget(StuImp stu){
this.stu = stu;
}
public void getName(){
System.out.println("代理前的操作");
stu.getName();
System.out.println("代理后的操作");
}
public void getAge(){
System.out.println("代理前的操作");
stu.getAge();
System.out.println("代理后的操作");
}
}
2.4 测试类
public class test {
public static void main(String[] args) {
StuImp stuImp = new StuImp();
StuDelget stuDelget = new StuDelget(stuImp);
stuDelget.getName();
stuDelget.getAge();
}
}
三、JDK动态代理
3.1 接口
public interface Stu {
public void show();
public void trash();
}
3.2 接口的实类
public class StuImp implements Stu{
@Override
public void show() {
System.out.println("获得姓名");
}
@Override
public void trash() {
System.out.println("获得年龄");
}
}
3.3 动态代理
实现InvocationHandler类返回任意对象的代理类重写invoke方法(代理的主要工作)
public class StuProxy implements InvocationHandler {
Object target;
/**
* 绑定委托对象并返回一个代理类
* @param target
* @return
*/
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = null;
System.out.println("代理前的一些操作");
invoke = method.invoke(target, args);
System.out.println("代理后端一些操作");
return invoke;
}
}
3.4 动态代理测试
传入一个实现接口的实现类一定是实现类来调用需要代理的方法的
public class test1 {
public static void main(String[] args) {
StuProxy stuProxy = new StuProxy();
Stu bind = (Stu) stuProxy.bind(new StuImp());
bind.show();
}
}
3.5 JDK动态代理不足
只能代理实现了接口的实现类,对没有实现接口的实现类不能代理。
四、Cglib动态代理
4.1 原理
针对未实现接口的类进行代理,需要一个继承该类的子类,来覆盖其方法实现增强。
4.2 接口
public interface Cgstu {
public void show();
public void doSth();
}
4.3 实现类
public class CgStuImp implements Cgstu {
@Override
public void show() {
System.out.println("show方法");
}
@Override
public void doSth() {
System.out.println("dosth方法");
}
}
4.4 Cglib动态代理
public class StucgLib implements MethodInterceptor {
Object target;
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回调方法
enhancer.setCallback((Callback) this);
// 创建代理对象
return enhancer.create();
}
@Override
// 回调方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("事物开始");
proxy.invokeSuper(obj, args);
System.out.println("事物结束");
return null;
}
}
4.5 测试
public class test2 {
public static void main(String[] args) {
CgStuImp cgStuImp = new CgStuImp();
StucgLib stucgLib = new StucgLib();
CgStuImp instance = (CgStuImp) stucgLib.getInstance(cgStuImp);
instance.show();
}
}
4.6 参考
https://blog.csdn.net/fanrenxiang/article/details/81939357