Spring:AOP之一

AOP的底层原理:动态代理

  • 有接口情况的动态代理,使用JDK动态代理。
    • 创建接口的实现类的代理对象
    • 再通过这个代理对象增强原实现类的方法。
  • 无接口情况的动态代理,使用CGLIB动态代理。
    • 创建当前类的子类的代理对象。
    • 再通过调用父类的方法实现增强

  • 通过Proxy类的newProxyIntance()方法获取接口代理类的实例。
  • 参数一:ClassLoader:类加载器(通过类名.getClass.getClassLoader()获得)
  • 参数二:interfaces:接口(通过运行时类获取:类名.getClass.getInterfaces()
  • 参数三:InvocationHandler:实现InvocationHandler,创建代理对象,写增强的逻辑。
//测试类
UserDaoImpl userDaoImpl = new UserDaoImpl();
UserDao userDao = (UserDao) Proxy.newProxyInstance
         (JDKProxy.class.getClassLoader(), userDaoImpl.getClass().getInterfaces(), 
          new UserDaoProxy(userDaoImpl));
int add = userDao.add(1, 2);
System.out.println(add);
//InvocationHandler的实现类
class UserDaoProxy implements InvocationHandler{
    private Object object;
    public UserDaoProxy(Object object) {
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在方法前输出
        System.out.println("在方法前输出"+method.getName());
        //通过反射调用方法。
        Object invoke = method.invoke(object, args);
        //在方法后输出
        System.out.println("在方法后输出"+ Arrays.toString(args));
        return invoke;
    }
}
posted @ 2022-01-16 00:01  Boerk  阅读(39)  评论(0)    收藏  举报