java的动态代理
jdk动态代理: 只能对实现接口的类产生daim
Cglib动态代理:对没有实现接口的类产生代理,生成子类 *
代理模式 (概念) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务。个人理解: jdk动态代理到底干了个什么事:自己已经编写好的类交给动态代理,在动态代理中执行代理方法可以添加一个额外的操作,比如给已完成差不多的项目再添加权限操作! 动态代理在后期方便对代码添加方法和去除不用改动过多的代码1.创建代理creatProxy()
public UserDao creatProxy() {
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
userDao.getClass().getClassLoader(), //类加载器 定义由那个类加载器加载 userDao.getClass().getInterfaces(),接口 给将要代理我俩的对象提供一组什么样的接口
this //当前代理对象调用的方法);
return userDaoProxy;
}
**2.创建接口 —>**当前代理对象调用的方法 implements InvocationHandler
然后在该接口的方法中执行判断是否增强需要增强的方法
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { if(“save”.equals(arg1.getName())) { //增强 System.out.println(arg1.getName()+“已经增强!”); return arg1.invoke(userDao, arg2); }else { System.out.println(arg1.getName()+“没有增强!”); return arg1.invoke(userDao, arg2); } }
Proxy.newProxyInstance()方法中三个参数的解释:
这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:
classloader: 定义了由哪个classloader(类加载器){当前对象的加载器}对象对生成的代理类进行加载 interfaces:一个interface对象数组,{当前对象的所有接口}表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。
InvocationHandler(this):一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。