Spring的AOP
代理模式


三种实现
1.

通过Proxy的newProxyInstance(类加载器,代理对象的所有接口,new invocationHandler )实现代理.method的invoke(目标对象,参数列表对象)调用代理对象的方法,返回Object是每个方法的返回值,添加的功能可以写在method方法的前后,newProxyInstance方法返回Object类型,需要转换类型.
InvocationHandler : 调用管理者---- 接口的唯一一个方法 invoke
Proxy : 代理类---提供很多方法,常用的有newProxyInstance
invoke()内
proxy:指代我们所代理的那个真实对象
method:被代理的方法
args:被代理方法的参数列表对象
Proxy
这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:
publicstaticObject newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handdler)throwsIllegalArgumentException
loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces:一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
handler:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
2.

使用Spring中增强类Enhancer实现aop方式
1.创建Enhancer对象
2.设置Enhancer的superclass setSuperclass(被代理的对象的class类)
3.设置Enhancer对象的回调方法setAllBack()
4.通过对象的create()返回代理对象
3

bean 的id 和 name的区别
id和name都是spring 容器中中bean 的唯一标识符。
id: 一个bean的唯一标识 , 命名格式必须符合XML ID属性的命名规范
name: 可以用特殊字符,并且一个bean可以用多个名称:name=“bean1,bean2,bean3”
,用逗号或者分号或者空格隔开。如果没有id,则name的第一个名称默认是id
us : 被代理的目标对象
my:额外添加的功能的类
proxy:代理创建代理对象的类
interfaces:被代理对象的接口们
target:目标对象
itercepetorNames ::额外添加的功能的类
optimiza: true(使用cglib 代码生成库,效率高 )/false(使用jdk自带的动态代理)

添加功能的类 需要实现 MethodInterceptor

网友评论