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增强。

  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>

过滤器类

  1. <span style="font-size:18px;">public class CharacterEncodingFilter implements Filter {
  2. @Override
  3. public void destroy() {}
  4. @Override
  5. public void doFilter(ServletRequest request, ServletResponse response,
  6. FilterChainchain) throws IOException, ServletException {
  7. request.setCharacterEncoding("GB18030");
  8. chain.doFilter(request,response);
  9. }
  10. @Override
  11. publicvoid init(FilterConfig filterConfig) throws ServletException {}
  12. }</span>

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

spring框架中AOP的使用

1,拷贝jar包

 

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

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

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

4,由配置文件声明

  1. <span style="font-size:18px;"><!--声明目标类-->
  2. <bean id="targetclass" class="com.spring.aop.TargetClass"></bean>
  3. <!--声明扩展类-->
  4. <bean id="extendsclass" class="com.spring.aop.extendsClass"></bean>
  5. <!--织入扩展类,并声明在哪个方法上执行扩展类-->
  6. <aop:config>
  7. <aop:aspect id="extendAspect" ref="">
  8. <aop:pointcut expression="execution(public ** (..))" id="extendsPoincat">
  9. <!--在目标方法执行前执行的方法-->
  10. <aop:before method="beforemethod" pointcut-ref="extendsPoincat" />
  11. <!--在目标方法执行后执行的方法-->
  12. <aop:after method="aftermethod" pointcut-ref="extendsPoincat" />
  13. </aop:aspect>
  14. </aop:config></span>

5,测试

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

Spring框架中使用AOP的优点

Aop与spring的IOC容器整合,增强,切入点都是javabean,可以在同一文件中配置

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

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

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

 
 

spring框架学习(六)AOP的更多相关文章

  1. Spring框架学习05——AOP相关术语详解

    1.Spring AOP 的基本概述 AOP(Aspect Oriented Programing)面向切面编程,AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查 ...

  2. Spring框架学习06——AOP底层实现原理

    在Java中有多种动态代理技术,如JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术是JDK和CGLIB. 1.JDK的动态代理 JDK动态代理是java.lang.reflec ...

  3. spring框架学习(三)——AOP( 面向切面编程)

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  4. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  5. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  6. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

  7. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  8. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  9. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

随机推荐

  1. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  2. Tomcat源码导入eclipse的步骤

    Tomcat源码导入eclipse 一.下载源码 1.  进入Apache 官网:http://tomcat.apache.org/ 2.  在左边侧选择要下载的源码的版本. 3.  或者直接通过Ar ...

  3. Protocols

  4. 自己写的java excel导出工具类

    最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...

  5. Saltstack之salt-master的打开文件数问题

    一.引言: 单个salt-master下的minion数已经达到2101个了,所以在master日志有如下的提示: 2016-09-09 11:36:22,221 [salt.utils.verify ...

  6. 使用dom4j操作XML

    DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...

  7. 关于php留言本网站的搭建

    1.检查php,http服务是否安装 [root@localhost ~]# rpm -qa | grep http httpd-tools--.el7.centos.x86_64 httpd--.e ...

  8. MongoDB由于目标计算机积极拒绝,无法连接

    遇到这个问题的时候,可以通过以下步骤解决: 1.打开Mongo安装包:进入Mongo下的data文件夹下的db文件夹,找到Mongod.lock,删除. 2.在命令行中输入: mongod.exe - ...

  9. php中echo(),print(),print_r()之间的区别

    echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)  print只能打印出简单类型变量的值(如int,string)  print_r可以打印出复 ...

  10. 接触Matlab5年一个总结(Matlab要掌握的一些要点 )

    阅读目录 前言 Matlab的开发环境与简单介绍 Matlab的常见命令 Matlab的灵魂-矩阵操作 Matlab的.m或.fig的编程与技巧 从大二开始接触到matlab,讲真,这是一个我觉得很良 ...