• Java框架spring 学习笔记(十二):aop实例操作


    使用aop需要在网上下载两个jar包:

    1. aopalliance.jar
    2. aspectjweaver.jar

    为idea添加jar包,快捷键ctrl+shift+alt+s,打开添加jar包的对话框,将刚才下载好的jar添加进去

    前置增强实例

    编写TimeHandler.java

    1 package com.example.spring;
    2 
    3 public class TimeHandler {
    4     public void beforTime()
    5     {
    6         System.out.println("前置增强:CurrentTime = " + System.currentTimeMillis());
    7     }
    8 }

    编写HelloWorld.java

    1 package com.example.spring;
    2 
    3 public class HelloWorld {
    4     public void printHello(){
    5         System.out.println("Hello Aop.");
    6     }
    7 }

     编写配置文件

     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:aop="http://www.springframework.org/schema/aop"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
     7         http://www.springframework.org/schema/aop
     8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
     9 
    10     <!-- bean definition & AOP specific configuration -->
    11     <!-- 1 配置对象-->
    12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
    13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
    14     
    15     <!-- 2 配置aop操作-->
    16     <aop:config>
    17         <!-- 2.1 配置切入点-->
    18         <!-- 设置切入点id为pointcut1 -->
    19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
    20 
    21         <!-- 2.2 配置切面-->
    22         <aop:aspect ref="timeHandler">
    23             <!-- 配置前置增强类型 ,method:增强类()里面的方法(beforTime())作为前置-->
    24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    25             <aop:before method="beforTime" pointcut-ref="pointcut1"/>
    26         </aop:aspect>
    27     </aop:config>
    28 </beans>

    编写Application.java

     1 package com.example.spring;
     2 
     3 import org.springframework.context.support.AbstractApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 public class Application {
     7     public static void main(String[] args) {
     8         //bean配置文件所在位置 D:\IdeaProjects\spring\src\Beans.xml
     9         //使用AbstractApplicationContext容器
    10         AbstractApplicationContext context = new ClassPathXmlApplicationContext("file:D:\IdeaProjects\spring\src\aop.xml");
    11         //得到配置创建的对象
    12         HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
    13         helloWorld.printHello();
    14     }
    15 }

    运行输出

    前置增强:CurrentTime = 1510134673408
    Hello Aop.

    可以看到,打印Hello Aop.之前会先打印当前的时间CurrentTime = 1510132664923。

    后置增强实例

    修改TimeHandler.java

     1 package com.example.spring;
     2 
     3 import org.aspectj.lang.ProceedingJoinPoint;
     4 
     5 public class TimeHandler {
     6     public void beforTime()
     7     {
     8         System.out.println("前置增强:CurrentTime = " + System.currentTimeMillis());
     9     }
    10 
    11     public void afterTime()
    12     {
    13         System.out.println("后置增强:CurrentTime = " + System.currentTimeMillis());
    14     }
    15 }

     修改配置文件aop.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:aop="http://www.springframework.org/schema/aop"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
     7         http://www.springframework.org/schema/aop
     8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
     9 
    10     <!-- bean definition & AOP specific configuration -->
    11     <!-- 1 配置对象-->
    12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
    13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
    14     
    15     <!-- 2 配置aop操作-->
    16     <aop:config>
    17         <!-- 2.1 配置切入点-->
    18         <!-- 设置切入点id为pointcut1 -->
    19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
    20 
    21         <!-- 2.2 配置切面-->
    22         <aop:aspect ref="timeHandler">
    23             <!-- 配置前置增强类型 method:增强类()里面的方法(beforTime())作为前置-->
    24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    25             <!--<aop:before method="beforTime" pointcut-ref="pointcut1"/>-->
    26 
    27             <!-- 配置后置增强类型 method:增强类()里面的方法(afterTime())作为后置-->
    28             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    29             <aop:after method="afterTime" pointcut-ref="pointcut1"/>
    30         </aop:aspect>
    31     </aop:config>
    32 </beans>

    运行输出

    Hello Aop.
    后置增强:CurrentTime = 1510134850754

    环绕增强实例

    修改TimeHandler.java

     1 package com.example.spring;
     2 
     3 import org.aspectj.lang.ProceedingJoinPoint;
     4 
     5 public class TimeHandler {
     6     public void beforTime()
     7     {
     8         System.out.println("前置增强:CurrentTime = " + System.currentTimeMillis());
     9     }
    10 
    11     public void afterTime()
    12     {
    13         System.out.println("后置增强:CurrentTime = " + System.currentTimeMillis());
    14     }
    15 
    16     public void aroundTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    17         //方法之前
    18         System.out.println("环绕增强:CurrentTime = " + System.currentTimeMillis());
    19 
    20         //执行被增强的方法
    21         proceedingJoinPoint.proceed();
    22 
    23         //方法之后
    24         System.out.println("环绕增强:CurrentTime = " + System.currentTimeMillis());
    25     }
    26 
    27 }

    修改aop.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:aop="http://www.springframework.org/schema/aop"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
     7         http://www.springframework.org/schema/aop
     8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
     9 
    10     <!-- bean definition & AOP specific configuration -->
    11     <!-- 1 配置对象-->
    12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
    13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
    14     
    15     <!-- 2 配置aop操作-->
    16     <aop:config>
    17         <!-- 2.1 配置切入点-->
    18         <!-- 设置切入点id为pointcut1 -->
    19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
    20 
    21         <!-- 2.2 配置切面-->
    22         <aop:aspect ref="timeHandler">
    23             <!-- 配置前置增强类型 method:增强类()里面的方法(beforTime())作为前置通知-->
    24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    25             <!--<aop:before method="beforTime" pointcut-ref="pointcut1"/>-->
    26 
    27             <!-- 配置后置增强类型 method:增强类()里面的方法(afterTime())作为后置通知-->
    28             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    29             <!--<aop:after method="afterTime" pointcut-ref="pointcut1"/>-->
    30 
    31             <!-- 配置环绕增强类型 method:增强类()里面的方法(aroundTime())作为环绕通知-->
    32             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    33             <aop:around method="aroundTime" pointcut-ref="pointcut1"/>
    34         </aop:aspect>
    35     </aop:config>
    36 </beans>

    运行输出

    环绕增强:CurrentTime = 1510135559066
    Hello Aop.
    环绕增强:CurrentTime = 1510135559074

    之后就不用修改源程序,只需通过调整配置文件,就可以调整程序的逻辑。

    修改配置文件

     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:aop="http://www.springframework.org/schema/aop"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
     7         http://www.springframework.org/schema/aop
     8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
     9 
    10     <!-- bean definition & AOP specific configuration -->
    11     <!-- 1 配置对象-->
    12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
    13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
    14     
    15     <!-- 2 配置aop操作-->
    16     <aop:config>
    17         <!-- 2.1 配置切入点-->
    18         <!-- 设置切入点id为pointcut1 -->
    19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
    20 
    21         <!-- 2.2 配置切面-->
    22         <aop:aspect ref="timeHandler">
    23             <!-- 配置前置增强类型 method:增强类()里面的方法(beforTime())作为前置通知-->
    24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    25             <aop:before method="beforTime" pointcut-ref="pointcut1"/>
    26 
    27             <!-- 配置后置增强类型 method:增强类()里面的方法(afterTime())作为后置通知-->
    28             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    29             <aop:after method="afterTime" pointcut-ref="pointcut1"/>
    30 
    31             <!-- 配置环绕增强类型 method:增强类()里面的方法(aroundTime())作为环绕通知-->
    32             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
    33             <aop:around method="aroundTime" pointcut-ref="pointcut1"/>
    34         </aop:aspect>
    35     </aop:config>
    36 </beans>

    运行输出

    前置增强:CurrentTime = 1510190036105
    环绕增强:CurrentTime = 1510190036105
    Hello Aop.
    环绕增强:CurrentTime = 1510190036122
    后置增强:CurrentTime = 1510190036122
  • 相关阅读:
    推荐系统中MAP与nDCG的计算方法
    ES 数据库常见命令
    SpringBoot整合Guacamole教程
    Docker简易安装教程
    战地指挥官 寻路
    vue 使用 websocket
    e'charts 地图 + 背景旋转
    vue-seamless-scroll 好用的无缝滚动插件
    vue-countTo---简单好用的一个数字滚动插件
    vue-cli3.0 使用postcss-plugin-px2rem(推荐)和 postcss-pxtorem(postcss-px2rem)自动转换px为rem 的配置方法;
  • 原文地址:https://www.cnblogs.com/zylq-blog/p/7805203.html
Copyright © 2020-2023  润新知