代理模式之见解

静态代理:
主类和代理类都实现了同一个接口,这样代理类在调用方法时,会执行主类的方法
创建接口:
public interface ProxyI {
public void test();
}
创建主类:
public class MainClass implements ProxyI {
@Override
public void test() {
System.out.println(“this is MainProxy”);
}
}
创建代理类:
public class ProxyClass implements ProxyI {
MainClass mainClass;
public ProxyClass(MainClass mainClass) {
this.mainClass = mainClass;
}
@Override
public void test() {
System.out.println(“this is ProxyClass”);
mainClass.test();
}
}
测试:
public static void main(String[] args) {
ProxyClass proxyClass = new ProxyClass(new MainClass());
proxyClass.test();
}
打印结果:
this is ProxyClass
this is MainProxy
缺点:不易扩展,需每次创建代理类

动态代理:
在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,会自动实现代理类。代理对象交给InvocationHandler来管理,代理对象执行的方法都会通过InvocationHandler中的invoke方法来执行。jdk为我们的生成了一个叫$Proxy0(这个名字后面的0是编号,有多个代理类会一次递增)的代理类
public class myproxy implements InvocationHandler{

Object targetobject;

public myproxy(Object object) {
	this.targetobject = object;
}

public Object invoke(Object proxy, Method method, Object[] args)
		throws Throwable {
	System.out.println("begin:proxy");
	Object result = method.invoke(targetobject, args);
	return result;
}

}
创建主类:
public class myclass implements myint{
public void mytest() {
System.out.println(“my:class”);
}
}
测试方法:
public class test {
public static void main(String[] args) {
myint mc = new myclass();
InvocationHandler in = new myproxy(mc);
myint mcnew = (myint) Proxy.newProxyInstance(myclass.class.getClassLoader(),myclass.class.getInterfaces(), in);
mcnew.mytest();
}
}
打印结果:
begin:proxy
my:class

AOP切面编程:
spring配置:
xml:


<aop:config>
	<aop:aspect id="inter" ref="inter">
		<aop:pointcut expression="execution(* intclass.inter.*(..))" id="addtime"/>
		<aop:before method="timebefore" pointcut-ref="addtime"/>
		<aop:after method="timeafter" pointcut-ref="addtime"/>
	</aop:aspect>
</aop:config>

interface:
public interface inter {
public void test();
}
class:
public class int1 implements inter{

@Override
public void test() {
	System.out.println("int1");
}

}
public class int2 implements inter {

@Override
public void test() {
	System.out.println("int2");
}

}
代理类:
public class testint {
public void timebefore(){
System.out.println(“before:”+System.currentTimeMillis());
}

public void timeafter(){
	System.out.println("after:"+System.currentTimeMillis());
}

}
测试类:
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(“ApplicationContext.xml”);
inter int1 = (inter) ac.getBean(“int1”);
int1.test();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值