JDK动态代理
程序员文章站
2022-04-17 21:04:26
JDK动态代理是通过JDK中的 java.lang.reflect.Proxy 类来实现的。 举例: 1.有如下接口和实现类: 接口: 实现类: 2.创建切面类MyAspect 3.创建MyBeanFactory类,在该类中通过Proxy实现动态代理 这里模拟了Spring框架Ioc思想代理类主要是 ......
jdk动态代理是通过jdk中的 java.lang.reflect.proxy 类来实现的。
举例:
1.有如下接口和实现类:
接口:
public interface userdao {
public void save();
public void update();
public void delete();
public void find();
}
实现类:
public class userdaoimpl implements userdao {
public void save() {
system.out.println("save 添加用户");
}
public void update() {
system.out.println("update 修改用户");
}
public void delete() {
system.out.println("delete 删除用户");
}
public void find() {
system.out.println("find 查询用户");
}
}
2.创建切面类myaspect
public class myaspect {
public void mybefore(){
system.out.println("方法执行前");
}
public void myafter(){
system.out.println("方法执行后");
}
}
3.创建mybeanfactory类,在该类中通过proxy实现动态代理
public class mybeanfactory {
public static userdao getbean(){
// 1.准备目标类
final userdao userdao = new userdaoimpl(); // 在spring中通过注入获取单例对象
//2.创建切面类
final myaspect myaspect = new myaspect();
//3.使用代理类,进行增强
return (userdao)proxy.newproxyinstance(mybeanfactory.class.getclassloader(),new class[]{userdao.class},new invocationhandler(){
public object invoke(object proxy, method method, object[] args) throws invocationtargetexception, illegalaccessexception {
//增强前
myaspect.mybefore();
object obj = method.invoke(userdao,args);
//增强后
myaspect.myafter();
return obj;
}
});
}
这里模拟了spring框架ioc思想
代理类主要是对创建的实例中的方法进行增强
4.测试
@test
public void demo3(){
userdao userdao = mybeanfactory.getbean();
userdao.save();
userdao.delete();
userdao.find();
userdao.update();
}
测试结果:
5.总结:jdk动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。
推荐阅读