什么是静态代理?
静态代理就是代理模式,给真实类做了个增强的方法
比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉。。。
就要用到增强方法,就在代理类中给你的方法增强
//静态代理模式public class Progects {/* @Test public void dd() {//真实代理 Subject jk=new Real(); //代理对象 Proxy hj=new Proxy(); //调度代理对象(jk)方法增强 hj.setSubject(jk); hj.add(); }*/
接下来就是 JDK动态代理实现:
@Test public void dds() {///JDk动态代理 final IUserDao jk=new UserDaoimpl();三个参数new出一个代理的实例类加载器,类接口最后一个是接口的实现类 IUserDao poxy=(IUserDao)Proxy.newProxyInstance(jk.getClass().getClassLoader(), jk.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("事务已经开启"); 调度这个方法里的invoke对象的jk method.invoke(jk,args);
* @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
return null; } });//最后代理方法当然要开启 poxy.add(); poxy.edit(); }
动态代理的AOP底层实现,有接口自动用的是JDK动态代理
CGLib动态代理
@Test public void ddss() {///CGLIb动态代理 final UserService service=new UserService(); //Enhancer对象 有了这个对象就能事项动态代理 Enhancer enhancer=new Enhancer(); //在内存中构建业务类的子类 enhancer.setSuperclass(service.getClass()); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { // 前置的业务逻辑操作 System.out.println("事务已开启");/* * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.*/ methodProxy.invoke(service,objects); //invoke调用了对象里的方法 // 调用被代理类的方法,传入参数args,得到返回 // 后置的业务逻辑操作 System.out.println("---结束"); return null; } }); UserService proxy=new UserService(); proxy.delete(); }
抽象主题:Subject:接口
目标对象(原始对象):RealSubject(要增强的对象) implements
代理对象:Proxy(植入目标对象) 实现了接口
before code block
business xxx.invoke()
after code block
动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理
1)JDK 在运行时运行时注入
本质:在内存中构建出接口的实现类
特点:被代理对象,必须有接口
Proxy.newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
InvocationHandler调度处理器
public interface InvocationHandler {
}
------------------------Code--------------
final IUSerDao dao=new UserDaoImpl();
import java.lang.reflect.Proxy;
InvocationHandler ih=new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] args){
==================前置===================
Object result=method.invoke(dao,args);
==================后置===================
return result;
}
};
IUSerDao proxy=(IUSerDao)Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHanlder){
};
proxy.add();
2)Cglib 底层,注入,编译期已经注入了
本质:在内存中生成被代理类(目标类)的【子类】
特点:可以在没有接口的情况下代理
对于不使用接口的业务类,无法使用JDK动态代理,cglib采用非常底层的字节码技术,可以为一个类创建子类,解 题
Enhancer xxx=yyy;
UserDaoImpl proxy=(UserDaoImpl)enhancer.create();
proxy.add();