Java静态动态代理以及spring实现代理

静态代理:



package com.ant.actor;

/*
 * 艺人
 */

public interface Artist {
	public void show();
}

package com.ant.actor;
/*
 * 代理类
 */
public class Agency implements Artist{
	private Artist Artist;
	public Agency(Artist Artist) {
		this.Artist = Artist;
	}

	public void show() {
		Artist.show();
	}
	
}


package com.ant.actor;
/*
 * 演员
 */
public class Actor implements Artist {
	
	public void show() {
		System.out.println("演员方法调用");
	}
	
}

动态代理:

代理类需要实现InvocationHandler接口

package com.ant.dynamic;

/*
 * 艺人
 */

public interface Artist {
	public void sing();
}

 


package com.ant.dynamic;
/*
 * 歌手类
 */

public class ZhangXueYou implements Artist{
	
	public void sing() {
		System.out.println("张学友唱歌");	
	}
}

package com.ant.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/*
 *代理类,实现InvocationHandler接口
 */
public class ChenShuFen implements InvocationHandler{
	private Artist Artist;
	
	public ChenShuFen(Artist Artist) {
		this.Artist = Artist;
	}


	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		Object o=method.invoke(Artist, args);
		return o;
	}
}

最后贴上测试类

	@Test
        //动态代理
	public void AopDynamic() {
		//com.ant.dynamic.Artist:方法接口;ZhangXueYou:歌手类;ChenShuFen:代理类需要实现InvocationHandler接口
		com.ant.dynamic.Artist artist=new ZhangXueYou();
		
		ChenShuFen shuFen=new ChenShuFen(artist);
		
		//混合产生代理对象;Proxy.newProxyInstance(歌手类类加载器(原对象的类加载器),歌手类实现的所有接口(原对象实现的所有接口),代理对象);
		artist=(com.ant.dynamic.Artist) Proxy.newProxyInstance(ZhangXueYou.class.getClassLoader(), ZhangXueYou.class.getInterfaces(),shuFen );
		artist.sing();
	}

spring实现代理


package com.ant.proxy;

/*
 * 艺人
 */

public interface Artist {
	public void MultiFunction();
}


package com.ant.proxy;
/*
 * 目标 Target
 */
public class HuGe implements Artist{
	
	public void MultiFunction() {
		System.out.println("胡歌是万能型演员");
	}
	
}

package com.ant.proxy;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/*
 *通知 Advince
 */
public class Ben implements MethodInterceptor{
	public Object invoke(MethodInvocation arg0) throws Throwable {
		Object o=arg0.proceed();
		return o;
	}
}

package com.ant.proxy;

import org.junit.Test;
/*
 * 测试类
 */
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
	
	@Test
	public void Spring() {
		ApplicationContext con=new ClassPathXmlApplicationContext("applicationcontext.xml");
		Artist artist=(Artist) con.getBean("myproxy");
		artist.MultiFunction();
	}
}


spring配置文件




	
	
	
	
	
	
	
	
		
		
		
		
		
			
				com.ant.proxy.Artist
			
		
		
		
		
			
				
			
		
		
	




你可能感兴趣的:(java)