java高新学习笔记4

来源:互联网 发布:spss21软件怎么安装 编辑:程序博客网 时间:2024/04/29 15:55

黑马程序员

       ----------------------android培训、java培训 、期待与您交流! ----------------------

什么是代理:
要为已存在的多个具有相同接口的目标类各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、实物管理、等等。
代理原理可以理解为,
代理类(代理类中的方法为调用目标类中方法并扩展)和目标类实现同一个接口,客户端调用程序直接对接口操作。

AOP(Aspect Oriented Program面向方面的变成):
交叉业务:安全、实物、日志等功能要贯穿到好多个模块中。
AOP的目标就是要使交叉业务模块化,可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果一样。

AOP

1.系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示:

安全事务日志

a)Student Service ----------|-----------|----------|----------

b)CourseService----------|-----------|----------|----------

c)MiscService------------|-----------|----------|----------

2.用具体的程序代码描述交叉业务:

a)method1method2 method3

b){{ {

c)------------------------------------------------切面

d)-------------- ------

e)------------------------------------------------切面

f)}} }

3.交叉业务的编程问题即为面向方面的编程(Aspect oiented program,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的。如下所示:

a)--------------------------------------------------切面

b)func1func2 func3

c){{ {

d)------ ---

e)}} }

f)-------------------------------------------------切面

4.使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。


动态代理技术:
JVM可以在运行期动态生成出类的字节码,这种动态生成类旺旺被用作代理类,即动态代理类。
JVM生成的动态类必须实现一个或多个接口,所以JVM生成的动态类只能用作具有相同接口的目标类和代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
代理类的各个方法中通常除了要调用目标和相应方法对外返回目标返回结果外,还可以在代理方法中的如下四个位置加上系统功能代码:
1、在调用目标方法之前
2、在调用目标方法之后
3、在调用目标方法前后
4、在处理目标方法异常的catch块中

 

 

 


创建动态类及查看其方法列表信息:
创建动态类的实例对象及调用其方法:
完成InvocationHandler对象的内部功能:
分析InvocationHandler对象的运行原理:
动态类生成的类实现了Collection接口(可以实现若干接口),生成的类有Collection接口中的所有方法和一个如下接受InvocationHandler参数的构造方法。
总结分析动态代理类的设计原理与结构:
运行原理:
客户端调用代理,代理的构造方法接受一个Handler,客户端调用代理的各个方法,代理各个方法将调用请求转给handler对象的invoke方法(可以添加新的方法),handler将对应请求分发给对应目标的相应请求。
把需要的功能封装成对象,即把切面你的代码封装成对象,以对象的形式传递,并执行对象就等于执行了切面的代码。
编写可生成代理和插入通告的通用方法:
实现类似spring的可配置的AOP框架:

工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象。
BeanFactory的构造方法接受代表配置文件的输入流对象,配置文件格式如下:
#xxx=java.util,ArrayList
xxx=cn.itcast.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvic

 ----------------------android培训、java培训、期待与您交流! ------------------

详细请查看:http://edu.csdn.net/heima

 

原创粉丝点击