• spring-JDK_AOP动态代理


    动态代理 的四个步骤:

    1. 通过实现 InvocationHandler 接口创建自己的调用处理器;

    2. 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;

    3. 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;

    4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入

     1 package com.yztc.aop;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 public class AccountProxy implements InvocationHandler {
     8     //代理目标对象
     9     private Object target;
    10     public Object newProxyInstance(Object object){
    11         this.target= object;
    12         return
    13                 Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
    14 
    15     }
    16 
    17 
    18     @Override
    19     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    20         System.out.println("start---->代理类开始工作!!");
    21         for (int i = 0; i < args.length; i++) {
    22             System.out.println(args[i]);
    23 
    24         }
    25         //在执行核心方法之前使用能够调用公共的操作
    26         System.out.println("调用核心方法之前");
    27         //要执行的核心方法
    28         Object invoke = method.invoke(target, args);
    29         System.out.println("调用核心方法之后");
    30         return invoke;
    31     }
    32 
    33 }
    1 package com.yztc.aop;
    2 
    3 public interface IAccountDao {
    4     void add(String name);
    5     void delete(String uid);
    6 }
     1 package com.yztc.aop;
     2 
     3 public class AccountDaoImpl implements IAccountDao {
     4 
     5     @Override
     6     public void add(String name) {
     7         System.out.println("add:==="+name);
     8     }
     9 
    10     @Override
    11     public void delete(String uid) {
    12         System.out.println("delete"+uid);
    13     }
    14 
    15 }
     1 package com.yztc.aop;
     2 
     3 import com.yztc.aop.bean.AccountDaoImpl2;
     4 import com.yztc.aop.bean.CglibProxy;
     5 
     6 public class TestMain {
     7     public static void main(String[] args) {
     8         IAccountDao accountDao = (IAccountDao) new AccountProxy().newProxyInstance(new AccountDaoImpl());
     9         accountDao.add("xiaoming");
    10         accountDao.delete("1");
    11 }
  • 相关阅读:
    判断点是否在一个任意多边形中
    linux 内存布局以及tlb更新的一些理解
    java(内部类)
    java(面向对象 )
    java(数组及常用简单算法 )
    java(运算符,控制流程语句,函数 )
    deep-in-es6(七)
    Java(标识符,关键字,注释,常量,变量)
    MarkDown study:
    *LeetCode--Ransom Note
  • 原文地址:https://www.cnblogs.com/1218-mzc/p/7688883.html
Copyright © 2020-2023  润新知