AOP(动态代理_JDK)

动态代理_JDK

静态代理:只能用于实现同一接口的类
JDK动态代理:JRE给我们提供类库(java.lang.reflect.InvocationHandler拦截器),不依赖第三方,动态也就是类似于公共方法,你调用它,然后传入相应的值。

具体实现方法:

package spring;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 动态代理_JDk:适用于所有接口,也就是说它象一个公共类一样那个接口都可以使用,需要就调
 * @author Administrator
 *
 */
public class ProxyHandler implements InvocationHandler{
	//实际对象
		private Object obj;//接收任意类型
		
		public Object bind(Object obj)
		{
			this.obj = obj;
			/**
			 * 根据实际对象 -> 代理对象
			 * 		参数:
						loader - 定义代理类的类加载器
						interfaces - 代理类要实现的接口列表
						h - 指派方法调用的调用处理程序 
			 */
			return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), this);
		}
		
		/*
		 proxy:1. 可以使用反射获取代理对象的信息(也就是proxy.getClass().getName())。
				 2. 可以将代理对象返回以进行连续调用,这就是proxy存在的目的,因为this并不是代理对象。
		  参考:https://blog.csdn.net/bu2_int/article/details/60150319 
		  
		 method:方法的名称
		 
		 arg:需要传递的参数
		 */
		@Override
		public Object invoke(Object proxy, Method metod, Object[] arg) throws Throwable {
			System.err.println("调用方法的对象"+this.obj.getClass().getName());
			System.out.println("调用的方法名称"+metod.getName());
			System.out.println("调用方法传递的参数"+Arrays.toString(arg));
			Object returnValue= metod.invoke(this.obj, arg);//第一参数就是你传入的object对象也就是上面那个,第二个是你传的参数是数组类型哦
			System.out.println("调用方法的放回值"+returnValue);
			return returnValue;
		}
}

测试:

package spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//加载解析applicationContext.xml
		//积极加载,在加载与解析xml的同时,即完成所有bean的实例化
		ClassPathXmlApplicationContext factory=new  ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("IOC容器加载完成");
		
		//声明要需要使用代理的bean
		IUserDao userDao1= (IUserDao)factory.getBean("userDao1");
		
		//声明动态代理的bean
		ProxyHandler proxyHandler=(ProxyHandler) factory.getBean("proxyHandler");
		
		//调用写好的bind方法传入需要代理的对象
		IUserDao proxy1= (IUserDao)proxyHandler.bind(userDao1);
		
		//再调用代理对象中要执行的方法就ok了
		proxy1.insertUser("詹丹");
		proxy1.selectUser();
		
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP中的JDK动态代理是一种实现动态代理的方式。它通过使用JDK的Proxy类和InvocationHandler接口来生成代理对象和处理代理逻辑。具体来说,当我们使用Spring AOP时,代理对象的生成直接使用了JDK动态代理的Proxy.newProxyInstance方法。而代理逻辑则是通过实现了InvocationHandler接口的invoke方法来实现的。在Spring AOP中,JdkDynamicAopProxy类实现了InvocationHandler接口,并完成了Spring AOP拦截器链拦截等一系列逻辑。通过JdkDynamicAopProxy的invoke方法,我们可以在目标方法执行前后添加额外的逻辑。这种方式的优点是可以在运行时动态地生成代理对象,不需要事先编写代理类的代码。这样可以更加灵活地实现横切关注点的功能,并且可以避免代码冗余。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Spring AOP --JDK动态代理方式](https://blog.csdn.net/m0_46195271/article/details/108714116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SpringAOP JDK动态代理](https://blog.csdn.net/weixin_46281472/article/details/125629339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值