zoukankan      html  css  js  c++  java
  • Spring AOP注解形式简单实现

    实现步骤:

      1:导入类扫描的注解解析器
        命名空间:xmlns:context="http://www.springframework.org/schema/context"
          xsi:schemaLocation="http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd"

        xml配置文件如下配置:<context:component-scan base-package="com.lxk.spring.aop.annotation"/>

      2:导入springAOP的注解解析器
        命名空间:xmlns:aop="http://www.springframework.org/schema/aop"
          xsi:schemaLocation="http://www.springframework.org/schema/aop 
          http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"

        xml配置文件如下配置:<aop:aspectj-autoproxy/>          //开启aop注释自动代理

      3:首先定义我们的类,实现项目中的某个功能。 

    1 import org.springframework.stereotype.Component;
    2 
    3 @Component("aopFun")                  //这里将此类加载到bean里面,这里是使用的注解形式,也可以通过spring.xml文件中配置<bean id="aopFun" class="com.zs.aop"></bean>进和依赖注入
    4 public class AopFun{
    5     public void printfStr(){
    6         System.out.println("执行切点方法");
    7     }
    8 }

       4:配置切面类,也就是配置在什么情况下我们去执行切点:

     1 /**
     2  * 注解方式声明aop
     3  * 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,<context:component-scan base-package="com.cjh.aop2"/>
     4  *      否则要在spring配置文件中声明一个bean对象)
     5  * 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。
     6  * 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。
     7  */
     8 @Component("aopTest")
     9 @Aspect
    10 public class AopTest{
    11     //定义切点
    12     @Pointcut("execution(* *.printfStr(..))")
    13     public void printfString(){}
    14     /**
    15      * 前置通知(注解中的printfString()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,
    16      * 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)
    17      * <aop:config>
    18         <aop:aspect ref="mistrel">
    19             <!-- 定义切点 -->
    20             <aop:pointcut expression="execution(* *.printfStr(..))" id="embark"/>
    21             <!-- 声明前置通知 (在切点方法被执行前调用) -->
    22             <aop:before method="beforSay" pointcut-ref="embark"/>
    23             <!-- 声明后置通知 (在切点方法被执行后调用) -->
    24             <aop:after method="afterSay" pointcut-ref="embark"/>
    25         </aop:aspect>
    26        </aop:config>
    27      */
    28     @Before("printfString()")            //before:在切点执行之前执行
    29     public void sayHello(){
    30         System.out.println("注解类型前置通知");
    31     }
    32     //后置通知
    33     @After("printfString()")            //After:在切点执行之后执行
    34     public void sayGoodbey(){
    35         System.out.println("注解类型后置通知");
    36     }
    37     //环绕通知。注意要有ProceedingJoinPoint参数传入。
    38     @Around("printfString()")
    39     public void sayAround(ProceedingJoinPoint pjp) throws Throwable{
    40         System.out.println("注解类型环绕通知..环绕前");      
    41         pjp.proceed();//执行方法
    42         System.out.println("注解类型环绕通知..环绕后");
    43     }
    44 }

       5:spring.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:aop="http://www.springframework.org/schema/aop"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
     8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
     9     <!-- 开启注解扫描 -->
    10     <context:component-scan base-package="com.zs.aop"/>
    11     <!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->
    12     <aop:aspectj-autoproxy/>
    13 </beans>

       6:测试类

     1 package com.cjh.aop2;
     2 
     3 import org.springframework.context.ApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 /**
     7  * 
     8  * @author Caijh
     9  * email:codecjh@163.com
    10  * 2017年7月11日 下午6:27:06
    11  */
    12 public class Test {
    13     public static void main(String[] args) {
    14         ApplicationContext ac = new ClassPathXmlApplicationContext("com/zs/aop/spring.xml");      //获取applicationContext对象
    15         AopFun bean1= (AopFun) ac.getBean("aopFun");          //通过spring的bean对象获取AopFun对象,并对对象进行依赖注入
    16         bean1.printfStr();                          //执行功能方法
    17     }
    18 }

       7:最后打印的结果为

        注解类型环绕通知..环绕前
        注解类型前置通知
        执行切点方法
        注解类型环绕通知..环绕后
        注解类型后置通知

    通知类型有:

      1:@Before:通知这个方法会在功能之前执行

      2:@After:通知这个方法会在功能之后执行

      3:@AfterThrow:通知这个方法会在功能抛出异常时执行

      4:@AfterReturning:通知这个方法会在功能return后执行

      5:@Around:通知这个方法会将功能封装起来

    在最后也简单说一下通过spring.xml文件配置aop

     1     <!-- 使用xml配置aop -->
     2     <!-- 强制使用cglib代理,如果不设置,将默认使用jdk的代理,但是jdk的代理是基于接口的 -->
     3     <aop:config proxy-target-class="true" />  
     4     <aop:config>
     5        <!--定义切面-->
     6        <aop:aspect id="logAspect" ref="logInterceptor">
     7        <!-- 定义切入点 (配置的的有printfStr方法在调用之前都会被拦截)-->
     8         <aop:pointcut expression="execution(execution(* *.printfStr(..)))" id="logPointCut"/>  
    9
       <!--方法执行之前被调用执行的-->
    10    <aop:before method="before" pointcut-ref="logPointCut"/><!--一个切入点的引用-->
    11    <aop:after method="after" pointcut-ref="logPointCut"/><!--一个切入点的引用-->
    12    </aop:aspect>
    13   </aop:config>
  • 相关阅读:
    Oracle存储过程和自定义函数笔记
    怎样将一个Long类型的数据转换成字节数组
    Java集合框架整理
    有了这些,java IO就不愁了
    java生成Excel文件,下载
    ajax使用
    java transient关键字
    Mysql乐观锁与悲观锁
    Spring(六)Spring执行流程
    Spring(五)AOP
  • 原文地址:https://www.cnblogs.com/EmilZs/p/9247360.html
Copyright © 2011-2022 走看看