xml文件的方式实现动态代理基于SpringAOP

1.配置spring容器

导入jar包  

    com.springsource.net.sf.cglib-2.2.0.jar
    com.springsource.org.aopalliance-1.0.0.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
    commons-logging-1.1.3.jar
    spring-aop-4.2.2.RELEASE.jar
    spring-beans-4.2.2.RELEASE.jar
    spring-context-4.2.2.RELEASE.jar
    spring-core-4.2.2.RELEASE.jar
    spring-expression-4.2.2.RELEASE.jar

配置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:p="http://www.springframework.org/schema/p"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:context="http://www.springframework.org/schema/context"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans
 8         http://www.springframework.org/schema/beans/spring-beans.xsd
 9         http://www.springframework.org/schema/context
10         http://www.springframework.org/schema/context/spring-context.xsd
11         http://www.springframework.org/schema/aop
12         http://www.springframework.org/schema/aop/spring-aop.xsd">
13         
14     <bean id="arithmeticCaludaImpXML" class="com.eduask.liusheng.aop.xml.ArithmeticCaludaImp"></bean>
15     <bean id="logXML" class="com.eduask.liusheng.aop.xml.Log"></bean>
16     
17     <aop:config>
18         <!-- 配置切点 -->
19         <aop:pointcut expression="execution(* com.eduask.liusheng.aop.xml.*.*(..))" id="pointcut"/>
20         <!-- 配置切面 -->
21         <aop:aspect id="logAspect" ref="logXML">
22             <aop:before method="before" pointcut-ref="pointcut"/>
23             <aop:after method="after" pointcut-ref="pointcut"/>
24             <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"/>
25             <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/>
26         </aop:aspect>
27     </aop:config>
28     
29 </beans>
applicationContext-aop-xml.xml

2.ArithmeticCaluda.java

 1 public interface ArithmeticCaluda {
 2 
 3     /**
 4      * 加
 5      * @param a
 6      * @param b
 7      * @return 8      */
 9     double add(double a, double b);
10 
11     /**
12      * 减
13      * @param a
14      * @param b
15      * @return16      */
17     double sub(double a, double b);
18 
19     /**
20      * 乘
21      * @param a
22      * @param b
23      * @return24      */
25     double mul(double a, double b);
26 
27     /**
28      * 除
29      * @param a
30      * @param b
31      * @return32      */
33     double div(double a, double b);
34 
35 }
ArithmeticCaluda.java

3.ArithmeticCaludaImp.java

 1 public class ArithmeticCaludaImp implements ArithmeticCaluda {
 2     /**
 3      * 加
 4      * @param a
 5      * @param b
 6      * @return 7      */
 8     public double add(double a,double b){
 9         double result=a+b;
10         return result;
11     }
12     /**
13      * 减
14      * @param a
15      * @param b
16      * @return17      */
18     public double sub(double a,double b){
19         double result=a-b;
20         return result;
21     }
22     /**
23      * 乘
24      * @param a
25      * @param b
26      * @return27      */
28     public double mul(double a,double b){
29         double result=a*b;
30         return result;
31     }
32     /**
33      * 除
34      * @param a
35      * @param b
36      * @return37      */
38     public double div(double a,double b){
39         double result=a/b;
40 //        int i=10/0;
41         return result;
42     }
43 }
ArithmeticCaludaImp.java

4.Log.java

 1 import java.util.Arrays;
 2 import org.aspectj.lang.JoinPoint;
 3 
 4 public class Log {
 5     
 6     public void before(JoinPoint jp){
 7         System.out.println("the method "+jp.getSignature().getName()+"() begin with "+Arrays.asList(jp.getArgs()));
 8     }
 9     
10     public void after(){
11         System.out.println("the method after ");
12     }
13     
14     public void afterReturning(JoinPoint jp,Object result){
15         System.out.println("the method "+jp.getSignature().getName()+"() end with ["+result+"]");
16     }
17     
18     public void afterThrowing(Exception e){
19         System.out.println("afterThrowing"+e.getMessage());
20     }
21 }
Log.java

5.Test.java

 1 import org.springframework.context.ApplicationContext;
 2 import org.springframework.context.support.ClassPathXmlApplicationContext;
 3 /**
 4  * aop之xml结合JoinPoint实现动态代理
 5  * @author Administrator
 6  *
 7  */
 8 public class Test {
 9     public static void main(String[] args) {
10         ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext-aop-xml.xml");
11         ArithmeticCaluda arithmeticCaluda=(ArithmeticCaluda) app.getBean("arithmeticCaludaImpXML");
12         arithmeticCaluda.div(10, 2);
13     }
14 }
Test.java

运行效果与注解的形式一致

需要注意的是:

配置切点<aop:pointcut />要在配置切面<aop:aspect />之前,否则报错;

配置<aop:after />与<aop:after-returning />时,顺序不同,执行结果也不同,顺序在前先执行

原文地址:https://www.cnblogs.com/qq634571685/p/7168885.html