• spring框架学习(六)AOP


    AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象。

     AOP的引入

     在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法;在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码拉。这种重复代码不仅使编码麻烦,而且还不容易维护。而AOP则将这些代码整理起来,将解决某个切面问题的代码单独的放在某个模块中,然后再织入到程序中。

    AOP中的术语

     

      Aspect:横切面的功能抽象出类,或接口, AOP编程重要的就是识别出横切面功能。

           方面,类似于字符编码功能) 

     Advice: 横切面功能的具体实现,需要根据实际的情况分析,如果在目标对象操作之前是 before在操作之后,就是 after advice。

           增强,类似于字符编码过滤器

     Pointcut:切入点,描述横切面功能应用的限制,不是所有的流程都需要,那些可以使用的地方就是切入点

           类似于过滤器的匹配规则 /*

     Joinpoint: 连接点,或指组件加入流程的时机,比如设置属性,调用方法,等,Spring只支持方法调用的连接点,而其他的一些框架支持属性的连接点如:AspectJ

           类似于过滤器的过滤规则 REQUESTFORWARD

     Weave: 缝合,将组件应用到业务流程中的这个过程,叫缝合或织入。

           类似于将过滤器配置到web.xml文件的过程

     Proxy,代理,在实现上,SpringAOP其实就是使用JDK的动态代理(使用接口的方式完成代理操作),也可以使用CGLIB(使用继承的方式完成代理操作)。

     Target目标,业务操作的实际对象

    实例:设置字符编码格式看作是一个Aspect方面,而拦截器就是一个Advice增强。

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <span style="font-size:18px;"><!-- 字符编码过滤器-->  
    2. <filter>  
    3. <filter-name>characterFilter</filter-name>  
    4. <filter-class>com.bjpowernode.egov.filter.CharacterEncodingFilter</filter-class>  
    5. </filter>  
    6. <filter-mapping>  
    7. <filter-name>characterFilter</filter-name>  
    8. <url-pattern>/servlet/*</url-pattern>  
    9. </filter-mapping>  
    10.  </span>  

    过滤器

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <span style="font-size:18px;">public class CharacterEncodingFilter implements Filter {  
    2.    
    3.    @Override  
    4.    public void destroy() {}  
    5.    
    6.    @Override  
    7.    public void doFilter(ServletRequest request, ServletResponse response,  
    8.       FilterChainchain) throws IOException, ServletException {  
    9.            request.setCharacterEncoding("GB18030");  
    10.            chain.doFilter(request,response);  
    11.    }  
    12.    
    13.    @Override  
    14.    publicvoid init(FilterConfig filterConfig) throws ServletException {}  
    15. }</span>  

    这样就不用在每个servlet中设置编码拉。。

    spring框架中AOP的使用

    1,拷贝jar

     

    2spring配置文件中增加命名空间和约束文件

    启用aop功能:就把标签添加进来就可以拉。

     

    3,写被代理的类和扩展类

     

    4,由配置文件声明

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <span style="font-size:18px;"><!--声明目标类-->  
    2. <bean id="targetclass" class="com.spring.aop.TargetClass"></bean>  
    3.   
    4. <!--声明扩展类-->  
    5. <bean id="extendsclass" class="com.spring.aop.extendsClass"></bean>  
    6.   
    7.   
    8. <!--织入扩展类,并声明在哪个方法上执行扩展类-->  
    9. <aop:config>  
    10.     <aop:aspect id="extendAspect" ref="">  
    11.         <aop:pointcut expression="execution(public ** (..))" id="extendsPoincat">  
    12.         <!--在目标方法执行前执行的方法-->  
    13.         <aop:before method="beforemethod" pointcut-ref="extendsPoincat" />  
    14.         <!--在目标方法执行后执行的方法-->  
    15.         <aop:after method="aftermethod" pointcut-ref="extendsPoincat" />  
    16.     </aop:aspect>  
    17. </aop:config></span>  



    5,测试

     成功的话,执行目标类中的目标方法targetmethod()时,会先执行扩展类中的beforemethod()方法,再执行目标方法,最后再执行aftermethod()方法。
     也就是我们只需要手动调用targetmethod方法,扩展类中的两个方法框架会在执行的时候通过读取配置文件,获取相应信息,自动给我们添加上扩展的方法。。
     测试肯定成功,不相信的话,可以自己试试。

    Spring框架中使用AOP的优点

       AopspringIOC容器整合,增强,切入点都是javabean,可以在同一文件中配置

     和spring的其他部分一样,可以在不同应用服务器之间任意移植

       spring实现Aop的拦截接口,使得用户不必绑定在特定的拦截器接口上

     aop面向切面的编程思想,打破面向对象的思维方式,我们要学习的不仅是aop的使用,更要学习面向切面的这种思想。

  • 相关阅读:
    Hive分桶bucket
    Error: java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block
    接上一篇嵌套循环问题之解决
    RPA自动化机器人uibot之循环嵌套坑
    Chrom谷歌浏览器没网之最全解决办法之一
    (语法糖)列表生成式之怪诞--(暂时无法理解)
    浅析scrapy与scrapy-redis的区别
    浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC
    OpenCV+TensorFlow图片手写数字识别(附源码)
    TensorFlow Object Detection API中的Faster R-CNN /SSD模型参数调整
  • 原文地址:https://www.cnblogs.com/qihuan/p/5439751.html
Copyright © 2020-2023  润新知