Spring -AOP -java静态代理和动态代理实例

静态代理-可以通过类代理也可以通过接口代理

动态代理只能通过接口代理,但比静态代理灵活


静态代理实例

/**
 * 静态代理可通过接口或者类进行代理
 * @author Administrator
 *
 */
public class StaticProxyTest {
	public static void main(String[] args) {
		//基于接口
		MyPhone myPhone = new MyPhoneImpl();
		StaticProxy proxy = new StaticProxy(myPhone);
		proxy.name("华为");
		//基于类
		MyPhoneClass myPhoneClass = new MyPhoneClass();
		ProxyEntity entity = new ProxyEntity(myPhoneClass);
		entity.name("小米");
	}
}

/**
 * 接口
 * @author Administrator
 *
 */
interface MyPhone{
	public void name(String str);
}
/**
 * 接口实现类
 * @author Administrator
 *
 */
class MyPhoneImpl implements MyPhone{

	@Override
	public void name(String str) {
		System.out.println("早上好"+str); 
	}
	
}

/**
 * 自定义静态代理类
 * @author Administrator
 *
 */
class StaticProxy implements MyPhone{
	MyPhone myPhone;
	
	public StaticProxy(MyPhone myPhone) {
		this.myPhone = myPhone;
	}

	@Override
	public void name(String str) {
		beforeFun();
		myPhone.name(str);
		afterFun();
		
	}
	
	public void beforeFun(){
		System.out.println("前置代理");
	}
	public void afterFun(){
		System.out.println("后置代理");
	}
}
/**
 * 实体类
 * @author Administrator
 *
 */
class MyPhoneClass{
	public void name(String str){
		System.out.println("基于类实现:"+str);
	}
}

/**
 * 基于类的代理
 * @author Administrator
 *
 */
class ProxyEntity extends MyPhoneClass{
	MyPhoneClass myPhone;
	
	
	public ProxyEntity(MyPhoneClass myPhone) {
		this.myPhone = myPhone;
	}
	@Override
	public void name(String str) {
		beforeFun();
		myPhone.name(str);
		afterFun();
	}
	public void beforeFun(){
		System.out.println("前置代理");
	}
	public void afterFun(){
		System.out.println("后置代理");
	}
}

动态代理实例

public class DynamicProxy implements InvocationHandler{
	private Object subject;//代理的真实对象
	
	public DynamicProxy(Object subject) {
		this.subject = subject;
	}


	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//添加前置
		beforeFun();
		//主方法
		method.invoke(subject, args);
		//添加后置
		afterFun();
		return null;
	}

	public void beforeFun(){
		System.out.println("前置代理");
	}
	public void afterFun(){
		System.out.println("后置代理");
	}
}
public class Test {


	public static void main(String[] args) {
		//代理的真实对象
		Phone myPhone = new MyPhone();
		//获取代理类,将真实对象放入代理类中
		InvocationHandler dynamicProxy = new DynamicProxy(myPhone);
		//调用Proxy的newProxyInstace方法创建代理对象
		Phone phone = (Phone) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), myPhone.getClass().getInterfaces(), dynamicProxy);
		phone.name("华为");
		phone.price(1000);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值