JAVA中代理模式

动态代理模式

静态代理模式 缺点: 一个代理类只能代理一中接口,所以我们真正在开发中 经常使用的是动态代理模式
动态代理模式: 就可以实现 一个代理类代理多个对象
实现动态代理模式 一般都会使用第三方的工具,常用的第三方工具 是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动态

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值