• JDK动态代理


    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动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。

  • 相关阅读:
    Markdown常用语法
    课程及资源链接
    cpa-会计
    高管具备的能力
    JDK并发包-copy
    Guava工具类学习-copy
    java开发注解大全-copy
    Codeforces Round #703 (Div. 2)
    [ABC200E] Minflip Summation
    Codeforces Round #720 (Div. 2)
  • 原文地址:https://www.cnblogs.com/outxiao/p/10991866.html
Copyright © 2020-2023  润新知