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


<!-- 字符编码过滤器-->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>com.bjpowernode.egov.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>


过滤器类

public class CharacterEncodingFilter implements Filter {

   @Override
public void destroy() {} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChainchain) throws IOException, ServletException {
request.setCharacterEncoding("GB18030");
chain.doFilter(request,response);
} @Override
publicvoid init(FilterConfig filterConfig) throws ServletException {}
}

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

spring框架中AOP的使用

1,拷贝jar包

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

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

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

4,由配置文件声明

<!--声明目标类-->
<bean id="targetclass" class="com.spring.aop.TargetClass"></bean> <!--声明扩展类-->
<bean id="extendsclass" class="com.spring.aop.extendsClass"></bean> <!--织入扩展类,并声明在哪个方法上执行扩展类-->
<aop:config>
<aop:aspect id="extendAspect" ref="">
<aop:pointcut expression="execution(public ** (..))" id="extendsPoincat">
<!--在目标方法执行前执行的方法-->
<aop:before method="beforemethod" pointcut-ref="extendsPoincat" />
<!--在目标方法执行后执行的方法-->
<aop:after method="aftermethod" pointcut-ref="extendsPoincat" />
</aop:aspect>
</aop:config>

5,测试

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

Spring框架中使用AOP的优点

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

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

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

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

Spring(6)—— AOP的更多相关文章

  1. Spring(4)AOP

    Spring(4)AOP 1.AOP概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...

  2. SSM框架之Spring(4)AOP

    Spring(4)AOP 1.AOP概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...

  3. [置顶] 深入浅出Spring(三) AOP详解

    上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...

  4. 深入浅出Spring(三) AOP详解

    上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...

  5. Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

    1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法   2.作用:本质上来说是一种简化代码的方式      继承机制      封装方法      动 ...

  6. spring(二) AOP注入

    AOP概念 l  AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 l  经典应用:事务管理.性能监视.安全检查.缓存 .日志等 l  Spring AOP使用纯Java实现,不需要专门的编译 ...

  7. 【Spring】每个程序员都使用Spring(四)——Aop+自定义注解做日志拦截

    一.前言 上一篇博客向大家介绍了Aop的概念,对切面=切点+通知 .连接点.织入.目标对象.代理(jdk动态代理和CGLIB代理)有所了解了.理论很强,实用就在这篇博客介绍. 这篇博客中,小编向大家介 ...

  8. 深入浅出Spring(四) Spring实例分析

    上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...

  9. [置顶] 深入浅出Spring(四) Spring实例分析

    上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...

随机推荐

  1. 构建hibernate

    package hanqi.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hib ...

  2. codeforces Round #320 (Div. 2) C. A Problem about Polyline(数学) D. "Or" Game(暴力,数学)

    解题思路:就是求数 n 对应的二进制数中有多少个 1 #include <iostream> #include<cstdio> using namespace std; int ...

  3. android5.0联系人 sort_key改成phonebook_label

    项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...

  4. 部署Icinga-php4

    关于Icinga-php4的文档信息及下载地址,可参考:http://icinga-cn.sourceforge.net/ 我这里使用的是icinga-pnp4-cn-1.12.2.tar.xz. 因 ...

  5. php变量-单引号不编译,双引号编译

    <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); $sTemp = ...

  6. 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...

  7. 记录一则ORA-00054,ORA-00031解决过程

    生产环境:AIX 5.3 + Oracle 10.2.0.5 任务要求:普通表改造分区表,历史数据不要   这个需求很简单: pl/sql导出建表语句,依次修改成分区的建表语句,注意将索引修改成本地索 ...

  8. T-SQL高级查询语句

    高级查询 1.连接查询,对结果集列的扩展select * from info select * from info,nation #形成笛卡尔积select * from info,nation wh ...

  9. 讲讲Android事件拦截机制

    简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...

  10. HTML5 canvas画布写炫彩动态的倒计时效果

    html代码如下,插入了2个js代码. <!DOCTYPE html> <html> <head> <title>canvas</title> ...