Aop-静态代理-jdk动态代理-CGLIB动态代理

/**
 * AOP:面向切面编程。
 * 1.对业务逻辑的各个部分进行隔离
 * 2.耦合度降低
 * 3.提高程序的可重用性,
 * 4.同时提高了开发的效率
 * 主要的功能: 日志记录,性能统计,安全控制,事务处理,异常处理
 * 功能: 让关注点代码与业务代码分离!(关注点,重复代码就叫做关注点)(关注点形成的类,就叫切面(类)!)
 * 体现:代理模式
 */
  1. 静态代理

    /**
     * 方法接口
     */
    public interface IUserDao {
        void save();
    }


    /**
     * 接口实现
     */
    public class UserDao implements IUserDao {
        @Override
        public void save() {
            System.out.println("存储数据");
        }
    }

    
    /**
     * 代理类
     */
    public static class UserDaoProxy implements IUserDao {
        private UserDao userDao;

        public UserDaoProxy(UserDao userDao) {
            this.userDao = userDao;
        }

        @Override
        public void save() {
            System.out.println("检测数据类型是否符合标准");
            userDao.save();
            System.out.println("打印日志");
        }
    }

        
    /**
     * 具体方法调用
     */
    public static void main(String[] args) {
        //静态代理
        new UserDaoProxy(new UserDao()).save();
    }

    

2、jdk动态代理

/**
 * Created on 2019/4/5.
 * jdk动态代理
 * 实现类,所以必须使用接口
 * 缺点:jdk动态代理,必须是面向接口,目标业务类必须实现接口
 *
 * @author Grak
 * @since 1.0
 */
public class JDKProxy implements InvocationHandler {

    // 这其实业务实现类对象,用来调用具体的业务方法
    private Object target;

    public JDKProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        System.out.println("调用开始处理");
        result = method.invoke(target, args);
        System.out.println("调用结束处理");
        return result;
    }

    public static void main(String[] args) {
        IUserDao userDao = new UserDao();// 被代理对象
        JDKProxy invocationHandlerImpl = new JDKProxy(userDao);//代理方法
        ClassLoader loader = userDao.getClass().getClassLoader();//类信息
        Class<?>[] interfaces = userDao.getClass().getInterfaces();//接口
        // 主要装载器、绑定类,接口,代理方法
        BaseSaticProxy.IUserDao newProxyInstance = (BaseSaticProxy.IUserDao) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
        newProxyInstance.save();
    }
}

3、CGLIB动态代理

/**
 * Created on 2019/4/5.
 * CGLIB动态代理
 * 不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码
 *
 * @author Grak
 * @since 1.0
 */
public class CGLIBProxy implements MethodInterceptor {

    private Object targetObject;

    public Object getInstance(Object target) {
        // 设置需要创建子类的类
        this.targetObject = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("开启事物");
        Object result = methodProxy.invoke(targetObject, objects);
        System.out.println("关闭事物");
        // 返回代理对象
        return result;
    }

    public static void main(String[] args) {
        CGLIBProxy cglibProxy = new CGLIBProxy();
        BaseSaticProxy.IUserDao userDao = (BaseSaticProxy.IUserDao) cglibProxy.getInstance(new BaseSaticProxy.UserDao());
        userDao.save();
    }

}

猜你喜欢

转载自blog.csdn.net/qq_35418518/article/details/89068761