Spring中的JDK动态代理

时间:2022-06-09 13:23:54

Spring中的JDK动态代理

  在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术。

  JDK的动态代理主要涉及Java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个复合某一接口的代理的实例。

  JDK动态代理其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类完成对目标对象的代理。这点也是与CGLIB代理最大不同之处,CGLIB代理是针对类生成代理。


下面我们来模拟JDK动态代理

  步骤一:创建一个接口UserDao

public interface UserDao {
    public void add();
    public void eidt();
}

  步骤二:创建一个UserDao接口的实现类UserDaoImpl

public class UserDaoImpl implements UserDao{

    public void add() {
        System.out.println("add OK!");

    }

    public void eidt() {
        System.out.println("eidt OK!");

    }

}

  步骤三:创建测试类UserTest(代理对象主要在测试类中创建)

/**
 *
 * 动态代理测试
 *
 */
public class UserTest {
    public static void main(String[] args) {
        //01.先创建出接口实现类
        final UserDao dao=new UserDaoImpl();
        //获取实现类的加载器
        UserDao proxy=(UserDao)Proxy.newProxyInstance(dao.getClass().getClassLoader()
                //获取实现类的接口
                , dao.getClass().getInterfaces()
                //Invocation(调用) Handler(处理)
                , new InvocationHandler() {

            /**
             * proxy  代理对象
             * method 被代理对象 方法  add()
             * args add方法的参数
             */

            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                System.out.println("前置增强");
                Object invoke = method.invoke(dao, args);
                System.out.println("后置增强");
                return null;
            }
        });
        proxy.add();
        proxy.eidt();
    }
}

  运行结果如下所示:

Spring中的JDK动态代理

使用JDK动态代理方法实现增强例子演示完毕