动态代理模式
静态代理模式 缺点: 一个代理类只能代理一中接口,所以我们真正在开发中 经常使用的是动态代理模式
动态代理模式: 就可以实现 一个代理类代理多个对象
实现动态代理模式 一般都会使用第三方的工具,常用的第三方工具 是jdk动态代理 和cglib动态代理
spring aop 动态代理模式
jdk动态代理实现
package com.aaa.proxy.dati;
import com.aaa.proxy.sta.BaoQiang;
import com.aaa.proxy.sta.Star;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/ * 创建jdk动态代理类 */
public class JdkProxy implements InvocationHandler {
private Object target;
/* 获取目标对象的代理对象 * @param target * @return */
public Object bind(Object target){
this.target =target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getI nterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法调用之前:"+args); Object invoke = method.invoke(target, args);
System.out.println("方法调用之后:"+args); return invoke;
}
public static void main(String[] args) {
//创建目标类对象 Star star = new BaoQiang();
//创建jdk动态代理类对象 JdkProxy jdkProxy = new JdkProxy();
//动态获取目标类对象的代理对象
Star proxy = (Star)jdkProxy.bind(star);
proxy.showMovie(50000L); proxy.sing(50000L);
}
}
cglib动态代理
cglib动态代理 可以代理任何类,没有实现接口的要求.
cglib动态代理 需要导入jar包:
然后我们就可以创建cglib的代理类了:
package com.aaa.proxy.dati;
import com.aaa.entity.Users;
import com.aaa.proxy.sta.BaoQiang;
import com.aaa.proxy.sta.Star;
import com.aaa.service.UserService;
import com.aaa.service.impl.UserServiceImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/*** cglib 代理类 */
public class CglibProxy implements MethodInterceptor {
/*** 返回目标对象的代理对象 * @param target * @return */
public Object bind(Object target){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法调用之前:"+objects);
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("方法调用之后:"+objects);
return o1;
}
public static void main(String[] args) {
//创建目标类对象 Star star = new BaoQiang();
//创建cglib动态代理类对象
CglibProxy cglibProxy = new CglibProxy();
//动态获取目标类对象的代理对象
Star proxy = (Star) cglibProxy.bind(star);
proxy.showMovie(50000L); proxy.sing(50000L);
UserService userService = new UserServiceImpl();
UserService proxy2 = (UserService)
cglibProxy.bind(userService); proxy2.save(new Users());
}
}
小结:spring aop 默认使用的代理模式是jdk动态代理 ,我们也可以通过改配置文件的方式 改成cglib动态