Spring 学习 --- AOP面向切面编程

一、简介

        Spring AOP 是 Spring 框架的重要组成部分,面向切面编程是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程。 Spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够了。

        AOP技术的实现,主要分为两大类,一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行; 二是采用静态植入的方式,引入特定的语法创建“切面”,从而使编译器可以在编译期间织入有关“切面”的代码。


二、AOP术语

    1、 切面(Aspect): 一个关注点的模块化, 这个关注点可能会横切多个对象。

    2、 连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候,在Spring AOP中,一个连接点总是表示一个方法的执行。

    3、通知(Advice): 在切面的某个特定的连接点上执行的动作,其中包括了“around”、“before”、“after”等不同类型的通知。

    4、切入点(Pointcut): 匹配连接点的断言,通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。

    5、 引入(Introduction): 用来给一个类型声明额外的方法或属性。

    6、 目标对象(Target Object): 被一个或者多个切面所通知的对象,也被称做被通知对象。

    7、 AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约。

    8、 织入(Weaving) : 把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对性爱那个,这些可以在编译时、类加载时和运行时完成。

   

三、 AOP通知类型

    1、 前置通知(Before Advice): 在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。

    2、 后置通知(After returning Advice): 在某连接点正常完成后执行的通知。

    3、 异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。

    4、 最终通知(After advice) : 在某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

    5、 环绕通知(Around Advice) : 包围一个连接点的通知,如方法调用,这是最强大的一种通知类型,环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。


四、AOP简单例子

     1、 打开eclipse创建java工程,导入spring核心包,有aop依赖的jar包

        

     2、 新建一个切面类 Translation,实现通知接口, 模拟事务操作

/**
 * 模拟事务的类 - 切面类
 * 
 * 	1. 前置通知接口 :MethodBeforeAdvice  表示方法调用前切入
 * 	2. 后置通知接口 :AfterReturningAdvice  表示方法调用之后切入
 * 	3. 异常通知接口 :ThrowsAdvice 表示有异常抛出时切入
 * @author admin
 *
 */
public class Translation implements MethodBeforeAdvice, AfterReturningAdvice,ThrowsAdvice{

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
		System.out.println("这是一个前置通知!");
	}

	@Override
	public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
		System.out.println("这是一个后置通知");
	}
	
	//该方法名固定
	public void afterThrowing(Exception e) {
		System.out.println("这是一个异常通知!");
	}

}

     3、创建业务代码,新建一个Service类,有一个方法service()

public class Service {
	
	public void service() {
		System.out.println("业务运行中");
	}
	
}

     4、 修改spring配置文件,将Service类交给spring管理,同时配置好AOP切面类

<?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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
     
    <!-- aop配置 -->
    <!-- 把切面类交给spring管理 -->
    <bean id="translation" class="com.neuedu.springaop.aop.Translation">
    </bean>
    <!-- 托管业务类 -->
    <bean id="service" class="test.Service" />
    <aop:config>
        <!-- 设置切入点 -->
        <!-- 切入点表达式说明: execution表示执行,第一个*表示修饰符号,接着配置package,接口名或类名.方法名(参数列表) -->
        <!-- *表示多种情况,参数的两点表示不定参数(0~n个参数) -->
        <aop:pointcut expression="execution(* test.*.*(..))" id="Pointcut"/>
        
        <!-- 配置aop通知  advice-ref:通知类   pointcut-ref: 切入点-->
        <aop:advisor advice-ref="translation" pointcut-ref="Pointcut"/>
    </aop:config>
        
        
</beans>

     5、 创建测试类

public class TestAop {
	public static void main(String[] args) {
		
		//加载spring上下文环境
		ApplicationContext context = new ClassPathXmlApplicationContext("config/applicationContext.xml");
		
		Service service = (Service)context.getBean("service");
		
		service.service();//调用业务代码
	}
}

     6、 结果

        

     7、 总结

        由上面的例子可以知道,在业务方法被调用之前触发了切面类中的前置通知方法,在业务方法调用完成后触发了切面类的后置通知方法,由此推出,在业务方法中抛出异常时也会调用切面类的异常通知方法,所以,通俗来说,AOP就是监测着业务方法的状态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值