Spring静态代理与动态代理机制笔记

来源:互联网 发布:局域网qq监控软件 编辑:程序博客网 时间:2024/05/17 08:59

深度解析静态代理和动态代理机制

1: 所谓静态代理机制,就是实现一个类已经实现的接口,代理类中的方法和那个实现接口类的方法相同,这样通过调用代理类的方法,来间接的调用实现类的方法,并且可以在代理类中的方法添加所要完成的其他一些安全性的验证等业务逻辑,这种称为静态代理方式,这种方式的缺点是代理类在编译的时候已经写死,而且只能实现一种接口的代理,虽然不直接通过调用实现类的方法,但是仍然存在纵向的安全验证的调用,没有根本简化代码。

2: 所谓的动态代理机制,与静态代理相反。首先编写一个类,该类继承一个InterfaceInvocationHandler)并实现Interface中的public Object invoke(Objectproxy,Method method,Object[] args)方法。在该类中编写一个方法,把要生成的动态代理类需要实现相同接口的那个类作为参数传递给这个方法,然后调用Proxy.newProxyInstance(loader,interface,h);方法,该方法返回一个动态代理类。

 

 

3: Spring为类动态生成代理的原理是当类中含有配置文件中定义的需要代理的类的方法时,Spring就为这个类生成一个代理。使用annoaction在类中注释配置是要加入一个标识函数,使用静态文件配置不需要加入此空方法。

SpringAOP的支持,首先必须引入相关的jar包,此包放在lib/aspect/下,使用方法有两种:一种是在模块中使用注解:@Aspect@Pointcut(execution(“* add*(..)”) joinpoint前面加入注释@Before(“标记空函数”)。第二种是静态配置文件的使用,在配置文件当中加入如下标签<aop:aspectj-autoproxy/>表示使用动态代理机制,然后在具体配置如下

<aop:config>

<aop:aspect  id=” ” ref=”aspectName”>

<aop:pointcut id=”  ”expression=” ”/>

<aop:beforemethod=”” pointcut-ref=” ”/>

</aop:aspect>

</aop:config>

4: 使用CGLIB代理机制和JDK动态代理机制

两者的区别为使用JDK代理机制必须实现接口,使用CGLIB代理机制不需要实现接口。

使用CGLIB代理机制时要引入相关的jar包,此包放在springlib/cglib/文件夹下,如果继承了接口的在配置文件中加入标签

<aop:aspectj-autoproxy  proxy-target-class=”true”/>表示使用强制CGLIB代理机制,

0 0