Spring AOP 简单理解

Posted 竹山一叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP 简单理解相关的知识,希望对你有一定的参考价值。

AOP技术即(面向切面编程)技术是在面向对象编程基础上的发展,AOP技术是对所有对象或一类对象编程。核心是在不增加代码的基础上,还增加了新的功能。AOP编程在开发框架本身用的比较多,而实际项目中,用的比较少。它是将分散在各个业务逻辑代码中的相同代码抽取出来形成一个独立的模块。

1、定义AOP术语

(1)切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域。

(2)通知(advice):切面的具体实现,包含五类通知。

(3)连接点(jointpoint):应用程序执行过程中插入切面的地点。

(4)切点(cutpoint):定义通知应该应用哪些连接点。

(5)引入(introduction):为类添加新方法和属性。

(6)目标对象(target):通知逻辑的织入目标类。

(7)代理(proxy):将通知应用到目标对象后创建的对象,应用系统的其他部分不用为了支持代理对象而改变

(8)织入(weaving):将切面应用到目标对象从而创建一个新代理对象的过程。

 

2、AOP原理和实例

(1)基础接口和类的实现:

Java代码  
  1. package com.jasson.aop;  
  2.   
  3. public interface TestServiceInter1 {  
  4.   
  5.     public void sayHello();  
  6. }  
  7.   
  8.   
  9. package com.jasson.aop;  
  10.   
  11. public interface TestServiceInter2 {  
  12.   
  13.     public void sayBye();  
  14.       
  15.     public void sayHi();  
  16. }  

 (2)实现类如下:

Java代码  
  1. package com.jasson.aop;  
  2.   
  3. public class TestService implements TestServiceInter1,TestServiceInter2 {  
  4.   
  5.     public void sayHello() {  
  6.         System.out.println("sayHello() method ");  
  7.     }  
  8.   
  9.     public void sayBye() {  
  10.         System.out.println("sayBye() method");  
  11.     }  
  12.       
  13.     public void sayHi() {  
  14.         System.out.println("sayHi() method");  
  15.     }  
  16. }  

 

(1)前置通知:要求在每个方法调用前进行日志记录,则用的前置通知,定义如下:

Java代码  
  1. package com.jasson.aop;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import org.springframework.aop.MethodBeforeAdvice;  
  6.   
  7. public class MyMethodBeforeAdvice implements MethodBeforeAdvice {  
  8.   
  9.     /** 
  10.      * method: 方法名 
  11.      * args: 输入参数 
  12.      * target: 目标对象 
  13.      */  
  14.     public void before(Method method, Object[] args, Object target)  
  15.             throws Throwable {  
  16.         System.out.println("前置通知调用 记录日志..."+method.getName());  
  17.     }  
  18. }  

 

配置文件如下:

 

Xml代码  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:context="http://www.springframework.org/schema/context"  
  5.         xmlns:tx="http://www.springframework.org/schema/tx"  
  6.         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  7.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  8.                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"   
  9.                 >  
  10. <!-- 配置被代理的对象,即目标对象 -->  
  11. <bean id="testService" class="com.jasson.aop.TestService" />  
  12. <!-- 配置前置通知 -->  
  13. <bean id="myMethodBeforeAdvice" class="com.jasson.aop.MyMethodBeforeAdvice" />  
  14. <!-- 配置代理对象 -->  
  15. <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">  
  16.     <!-- 代理接口集 -->  
  17.     <property name="proxyInterfaces">  
  18.         <list>  
  19.             <value>com.jasson.aop.TestServiceInter1</value>  
  20.             <value>com.jasson.aop.TestServiceInter2</value>  
  21.         </list>  
  22.     </property>  
  23.     <!-- 把通知织入到代理对象  -->  
  24.     <property name="interceptorNames">  
  25.         <!-- 相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们也  
  26.         可以把通知看出拦截器,struts2核心拦截器 -->  
  27.         <list>  
  28.             <value>myMethodBeforeAdvice</value>  
  29.         </list>  
  30.     </property>  
  31.     <!-- 配置被代理对象,即目标对象 -->  
  32.     <property name="target" ref="testService"/>  
  33. </bean>  
  34. </beans>  

 

Java代码  
  1. package com.jasson.aop;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class App1 {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13.         ApplicationContext ac=new ClassPathXmlApplicationContext("com/jasson/aop/beans.xml");  
  14.         TestServiceInter1 ts=(TestServiceInter1) ac.getBean("proxyFactoryBean");  
  15.         ts.sayHello();  
  16.         System.out.println("*******************************************");  
  17.         ((TestServiceInter2)ts).sayBye();  
  18.         System.out.println("*******************************************");  
  19.         ((TestServiceInter2)ts).sayHi();  
  20.     }  
  21.   
  22. }  

 

 执行结果如下:

Java代码  
  1. 31-May-2012 18:19:53 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
  2. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@c8f6f8: defining beans [testService,myMethodBeforeAdvice,myAfterReturningAdvice,myMethodInterceptor,myThrowsAdvice,proxyFactoryBean]; root of factory hierarchy  
  3. 前置通知调用 记录日志...sayHello  
  4. sayHello() method   
  5. *******************************************  
  6. 前置通知调用 记录日志...sayBye  
  7. sayBye() method  
  8. *******************************************  
  9. 前置通知调用 记录日志...sayHi  
  10. sayHi() method  

 

(2)后置通知:要求在调用每个方法后执行的功能,例如在调用每个方法后关闭资源

 

Java代码  
  1. package com.jasson.aop;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import org.springframework.aop.AfterReturningAdvice;  
  6.   
  7. public class MyAfterReturningAdvice implements AfterReturningAdvice {  
  8.   
  9.     @Override  
  10.     public void afterReturning(Object returnValue, Method method, Object[] arg,  
  11.             Object target) throws Throwable {  
  12.         // TODO Auto-generated method stub  
  13.         System.out.println("后置通知调用,关闭资源..."+method.getName());  
  14.     }  
  15. }  

 bean 配置如下:

Xml代码  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. 如何简单理解spring aop和事务

    对于Spring IOC 和 AOP 简单理解

    如何理解Spring的AOP?

    Spring Aop的理解和简单实现

    如何理解Spring的AOP?

    5 分钟理解 Spring 中的 AOP