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;
}
}

浙公网安备 33010602011771号