动态代理解析和介绍就不说了网上很多其他博客说的.
这边只展示两种代理的实现方式小demo:
接口:
package ecan.bi.test.entity;
/**
* @Description:
* @author HuangMin
* @date 2020年6月10日09:34:47
* @version v1.0.0
*/
public interface DogSuper {
void eat();
}
实现类:
package ecan.bi.test.entity;
/**
* @Description:被代理对象
* @author HuangMin
* @date 2020年6月10日09:30:31
* @version v1.0.0
*/
public class Dog implements DogSuper{
public void eat(){
System.out.println("被代理对象原来业务逻辑:======吃东西======");
}
}
JDK方式代理(我直接用lamda表达式做的):
/**
* @Author HuangMin
* @Description JDK动态代理测试(有实现类可回调实现类的代理,无实现类直接内部增强实现接口中方法)
* @Date 2020/6/10 9:41
* @Param []
* @return void
**/
@Test
public void TestJdkProxy() {
Dog dog=new Dog();
DogSuper dogSuper=(DogSuper)Proxy.newProxyInstance(BaseTest.class.getClassLoader(),new Class<?>[]{DogSuper.class}, (proxy, method, args) -> {
System.out.println("===代理前===");
// 回掉被代理对象(Dog类)
Object result = method.invoke(dog, args);
System.out.println("===代理后===");
return null;
});
dogSuper.eat();
}
控制台输出:
cglib方式代理
/**
* @Author HuangMin
* @Description cglib动态代理简单测试.(根据实现类生成一个代理类,进行增强)
* @Date 2020/6/10 9:40
* @Param []
* @return void
**/
@Test
public void TestCglibProxy() {
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(Dog.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("======>方法增强前");
methodProxy.invokeSuper(o, objects);
System.out.println("======>方法增强后");
return null;
}
});
DogSuper dog = (DogSuper)enhancer.create();
dog.eat();
}
控制台输出: