一、AOP 是什么?

AOP 是Aspect Oriented Programaing 的简称,意思是面向切面编程,AOP的应用场合是受限的,一般只适合于那些具有横切逻辑的应用场合:如性能检测、访问控制、事务管理以及日志记录。

二、AOP 术语

1、连接点: 程序执行的某个特定位置,如类开始初始化前,类初始化后、类某个方法调用前、调用后、方法抛出异常后;一个类或一断程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为连接点。

2、切点

3、增强(Advice)

4、目标对象

5、引介(Introduction)

6、织入(Weaving)

7、代理(Proxy)

8、切面(Aspect)

三、基于@AspectJ的AOP

一个简单的例子

定义一个接口和实现类,作为增强的目标对象.

package com.baobaotao;

public interface Waiter {
public void greetTo(String clientName);
public void serveTo(String clientName);
}
package com.baobaotao;

public class NaiveWaiter implements Waiter {

	public void greetTo(String clientName) {
System.out.println("NaiveWaiter:greet to "+clientName+"...");
} public void serveTo(String clientName) {
System.out.println("NaiveWaiter:serving "+clientName+"..."); }
public void smile(String clientName,int times){
System.out.println("NaiveWaiter:smile to "+clientName+ times+"times...");
} }

然后,我们通过@Aspect注解定义一个切面,里面包含切点、增强类型和增强的横切逻辑.

package com.baobaotao.aspectj;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; @Aspect //(1)通过该注解将PreGreetingAspect标识为一个切面
public class PreGreetingAspect {
@Before("execution(* greetTo(..))")//(2)定义切点和增强类型(前置增强before)
public void beforeGreeting(){//(3)增强的横切逻辑
System.out.println("How are you!");
}
}

我们通过org.springframework.aop.aspectj.annotation.AspectJProxyFactory 为NativeWaiter生成织入PreGreetingAspect切面的代理,如下:

package com.baobaotao.aspectj;

import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;

import com.baobaotao.NaiveWaiter;
import com.baobaotao.Waiter; public class AspectJProxyTest { public static void main(String[] args) {
Waiter target=new NaiveWaiter();
AspectJProxyFactory factory=new AspectJProxyFactory();
//设置目标对象
factory.setTarget(target);
//添加切面类
factory.addAspect(PreGreetingAspect.class);
//生成织入切面的代理对象
Waiter proxy=factory.getProxy();
proxy.greetTo("John");
proxy.serveTo("John");
}
}

运行后输出:

log4j:WARN No appenders could be found for logger (org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory).
log4j:WARN Please initialize the log4j system properly.
How are you!
NaiveWaiter:greet to John...
NaiveWaiter:serving John...

至此代理对象的greeTo方法已经织入了切面类所定义的增强逻辑了.

四、如何通过配置使用@AspectJ切面

前面是使用编程方式织入切面 ,一般情况下我们是通过Spring的配置完成切面的织入的工作. 使用AOP命名空间,自动将切面织入到目标Bean中.

<?xml version="1.0" encoding="UTF-8"?>

<beans   xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 基于@Aspect切面的驱动器 -->
<aop:aspectj-autoproxy/>
<!-- 目标Bean -->
<bean id="waiter" class="com.baobaotao.NaiveWaiter"/>
<!-- 使用了@Aspect注解的切面类 -->
<bean class="com.baobaotao.aspectj.PreGreetingAspect" />
<!-- 自动代理创建器,自动将@Aspect注解切面类织入到目标Bean中 -->
<!-- 不使用aop命名空间 -->
<!-- <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>
-->
</beans>

注解:在配置文件中引入aop命名空间,然后通过aop命名空间的<aop:aspectj-autoproxy/> 自动为Spring容器中那些匹配@Apsect切面的Bean创建代理,完成切面织入。当然,Spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator

进行自动代理的创建工作,但具体的实现细节已经被<aop:aspectj-autoproxy/> 隐藏起来了.

<aop:aspectj-autoproxy/>有一个proxy-target-class属性,默认为false,表示使用JDK动态代理织入增强,当配置为<aop:aspectj-autoproxy   proxy-target-class ="true">时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类设有声明接口,则Spring将自动使用CGLib动态代理。

下面我们对上面的配置进行测试:

package com.baobaotao.aspectj;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.baobaotao.Waiter; public class TestPreGreetingAspect { public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("com/baobaotao/aspectj/aop.xml");
Waiter waiter=(Waiter) ctx.getBean("waiter");
waiter.greetTo("Tom");
waiter.serveTo("Tom");
}
}

输出:

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
How are you!
NaiveWaiter:greet to Tom...
NaiveWaiter:serving Tom...

Spring AOP (一)的更多相关文章

  1. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  2. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  3. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  4. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  5. 基于Spring AOP的JDK动态代理和CGLIB代理

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

  6. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  8. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  9. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  10. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

随机推荐

  1. 到底什么是集群&分布式

    对于楼主这样工作一年的菜鸟,偶尔会看到一些文章标题带有"分布式""集群"关键字,然后就懵逼了.最近对这些概念进行了一定的了解,整理了一下思路,在这里分享给各位猿 ...

  2. 使用eclipse开发工具与hibernate开发者为开源一起做贡献

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50525363 hibernate使用的是gradle自动构建工具, ...

  3. Kafka系列之-自定义Producer

    前面已经讲到了,在Kafka中,Message是由Producer产生的,Producer产生的Message会发送到Topic的指定Partition中.Producer可以有多种形式,也可以由用户 ...

  4. 剑指Offer——顺丰笔试题+知识点总结

    剑指Offer--顺丰笔试题+知识点总结 情景回顾 时间:2016.10.16 19:00-20:40 地点:山东省网络环境智能计算技术重点实验室 事件:顺丰笔试 知识点总结 快排 霍尔排序(快排) ...

  5. Spark运行架构

    http://blog.csdn.net/pipisorry/article/details/52366288 1. Spark运行架构 1.1 术语定义 lApplication:Spark App ...

  6. tomcat生命周期的管理——生命周期统一接口Lifecycle

    我们知道Tomcat的架构设计是清晰的.模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦 ...

  7. iOS开发之WKWebView代替UIWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  8. 06 Activity显示跳转

    <span style="font-size:18px;">package com.fmy.day8_29task; import com.fmy.day8_29tas ...

  9. gradle测试出现IllegalArgumentException

    今天clone了一份代码,跑gradle test时出现failed,从report上来看是这个错误:IllegalArgumentException,具体如下: java.lang.IllegalA ...

  10. Git管理工具对比(GitBash、EGit、SourceTree)

    Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...