黑马程序员_20 代理

来源:互联网 发布:java api文档 编辑:程序博客网 时间:2024/06/05 22:46


---------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! -----------------


                               代理


代理模式的主要作用是为其他对象提供一种代理以控制对这个对象
的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,
而代理对象可以在
客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对
象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对
象进行通信。

应用场景
例如:假设有一组对象都实现同一个接口,实现同样的方法,但这组对象
中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加
上这个单独的方法,但是代码重用性低,耦合性高。如果用代理的方法则
很好的解决了这个问题。
实例说明
假设有一个Italk接口,有空的方法talk()(说话),所有的people对象都实现
(implements)这个接口,实现talk()方法,前端有很多地方都将people实例化,
执行talk方法,后来发现这些前端里有一些除了要说话以外还要唱歌(sing),那么我
们既不能在Italk接口里增加sing()方法,又不能在每个前端都增加sing方法,我们只有
增加一个代理类talkProxy,这个代理类里实现talk和sing方法,然后在需要sing方法的
客户端调用代理类即可,代码如下:

接口类Italk

public interface Italk {
public void talk(String msg);
}

实现类people

public class People implements Italk {
public String username;
public String age;
public String getName() {
return username;
}
public void setName(String name) {
this.username= name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public People(String name1, String age1) {
this.username= name1;
this.age = age1;
}
public void talk(String msg) {
System.out.println(msg+"!你好,我是"+username+",我年龄是"+age);
}
}
动态代理技术
JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,
即动态代理类。
JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具
有相同接口的目标类的代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,
如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,
还可以在代理方法中的如下四个位置加上系统功能代码:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中

AOP
交叉业务的编程问题即为面向方面的编程(Aspect oriented program ,简称AOP),
AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,
这与直接在方法中编写切面代码的运行效果是一样的
实现AOP功能的封装与配置
工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。
其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件
中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实
例对象的getProxy方法返回的对象。
BeanFactory的构造方法接收代表配置文件的输入流对象,配置文件格式如下:
#xxx=java.util.ArrayList
xxx=cn.itcast.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvice
ProxyFacotryBean充当封装生成动态代理的工厂,需要为工厂类提供哪些配置参数信息?
目标
通知


---------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------

原创粉丝点击