spring中jdk的动态代理机制

spring中jdk的动态代理机制

JDK动态代理 对“装饰者”设计模式简化。使用前提:必须有接口

  • 目标类
public interface UserService {
	public void addUser();
	public void updateUser();
	public void deleteUser();
}
  • 切面类
public class MyAspect {

	public void before(){
		System.out.println("鸡首");
	}
	
	public void after(){
		System.out.println("牛后");
	}
}
  • 工厂类
public class MyBeanFactory {

	public static UserService createService(){
		//1.目标类
		final UserService userService = new UserServiceImpl();
		//2.切面类
		final MyAspect myAspect = new MyAspect();
		/*3.代理类 :将目标类(切入点)和切面类(通知) 结合   --->切面*/
		UserService proxService = (UserService)Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),
				userService.getClass().getInterfaces(), new InvocationHandler() {
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
						//前执行
						myAspect.before();
                        
						//执行目标方法
						Object obj = method.invoke(userService, args);
						
						//后执行
						myAspect.after();
						return null;
					}
				});
		return proxService;
	}
}

在这里我们主要讲一下这个工厂类:

  • 这个newProxyInstance()方法是spring中,Proxy代理中的静态方法,见源码:
    在这里插入图片描述
    主要的作用就是新建一个代理对象,有三个参数:
  • ClassLoader loader :获得当前类的类加载器,将类通过类加载器加载到内存中
  • Class<?>[] interfaces:代理类需要实现的接口
  • InvocationHandler h :这是一个接口
    在这里插入图片描述
    调用其中的invoke方法运行对象
    在这里插入图片描述
  • 最后就是测试类
	@Test
	public void demo01(){
		UserService userService = MyBeanFactory.createService();
		userService.addUser();
		userService.deleteUser();
		userService.updateUser();
	}

总结:在进行实现jdk动态代理时,主要需要掌握设计模式中的代理模式,生成代理对象,代理对象来代理目标类的所有操作,提高生产时的灵活性,这个是必须掌握的。

发布了25 篇原创文章 · 获赞 22 · 访问量 5418

猜你喜欢

转载自blog.csdn.net/weixin_42893085/article/details/104382948