spring AOP初步总结

来源:互联网 发布:晨曦计算式数据没了 编辑:程序博客网 时间:2024/05/21 09:07
     

属性注入:可以有ref注入,内部<bean>来定义:只属于某个属性

spring默认从工厂里获取的bean是单例的,但假如给bean加上scope="prototype"属性,则获取的是多例的(采用的是延迟创建的思想,在使用bean的时候才去创建),这个技术可以为strut1生成多例的Action(单例是其优点,也是其缺点,由于spring在底层已经完成同步,高层同步势必降低效率,spring采用代理技术,将Acton在工程中创建,其action也有scope="prototype"这个属性)

为什么要用代理?

在维护过程中,代码已经写好,但是我们想在原先的基础上增加一些功能,但又不能修改原有的代码。这时候我们可以通过spring增加一个横切性关注点,比如权限验证,日志,安全性检查。

  静态代理:代理对象和目标对象有共同的接口,实现了相同的方法,并且有个属性是目标对象的接口,我们可以通过spring配置或注解注入接口的实现类(真正的目标类),这样我们就可以通过重写父类中的方法,并对其增加新的功能,显示的调用目标类的方法,便实现了静态代理。

  关注点实现:advice

 关注点放在类中:类是切面类

 生成的对象是切面

 将advice应用到目标对象的方法的过程就是织入,且该方法是pointcut

 在方法之前是beforeadvice

 在方法之后是afteradvice

 把advice用在某个地方(spring是用在方法上):joinpoint

 当然也有一些是用在属性或类上,spring比较灵活,用在方法上。


动态代理?动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

      实现InvocationHanlde这个接口,并实现invoke这个方法--->

      创建代理对象:通过一个新增的方法将目标对象注入,并调用代理的技术创建该目标对象的代理类(Proxy.newProxyInstance(和目标对象一样的类装载器,目标类实现的接口,目标类的地址-->this))

      在增加功能后,通过方法反射执行目标对象的方法:给目标对象的方法增加新的功能(织入),这样会给目标对象的每个方法都会织入,可以通过method去判断给要织入方法,然后再通过反射机制执行目标对象的要增加功能的方法。

   

0 0
原创粉丝点击