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:[email protected]
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>

原文地址:https://www.cnblogs.com/EmilZs/p/9247360.html

时间: 2024-10-13 19:58:00

Spring AOP注解形式简单实现的相关文章

Spring AOP 注解形式

AspectOriented Programing,面向切面编程.   AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等.将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码.  Spring AOP织入增强(Advice)的方式有两种 如果连接点实现了接口采用jdk自带的动态代理的形式实现织入,如果连接点没有实现接口则采用动态

Spring AOP注解方式实现

简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文将介绍Spring AOP的常用注解以及注解形式实现动态代理的简单示例. 常用注解 @aspect:定义切面 @pointcut:定义切点 @Before:前置通知,在方法执行之前执行 @After:后置通知,在方法执行之后执行 @AfterRunning:返回通知,在方法返回结果之后执行 @Aft

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm 本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifi

Spring AOP 注解配置实例

Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1.6.7.jar和aspectjweaver-1.6.8.jar和aopalliance.jar (注意这里最好是1.6.7以上的版本,不然容易出错,折腾了我好久,最后才发现是包的版本问题. 所以这里一定要注意,spring 2.0以后的最好是用1.6.7的版本) 二: 建一个class类作为切入面

Spring AOP Aspect的简单实现(基于注解)

第1步:声明使用注解 <!-- 配置扫描注解--> 扫描包的位置<context:component-scan base-package="com.zz"/> <!-- 配置aop 注解生效 --><aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!--aop配置 切面类名--> 用于申明切面类<aop:config> <aop:aspect ref

Spring Aop 实现一个简单的memcached小插件

memcached我就不多做介绍了,也就是一个分布式缓存系统!是一个典型的NOSQL. 下面我将用spring aop来实现一个简单的插件,来实现annotation方式,简单方便的取得缓存 一.首先我们得定义一个annotation. <strong>package org.xiezhaodong.spring.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType

转:Spring AOP 注解方式实现的一些“坑”

使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解很多问题! 1. SpringBoot如何获得Aspect支持? 看这里:Spring Boot 开启AOP的方法 2. 我按照上面的方法开启了AOP支持,为什么始终是不走切入点方法呢? 首先仔细检查一下,Aspect类是不是少了@Component注解(这一点很重要!),只有一个@Aspect注解

日志异常处理-spring aop注解

spring aop 可以在不破坏我们程序代码的前提下很好的对程序异常进行打印,网上也有很多这样的例子,我这里写的比较简单,只是针对程序出异常时进行见到的日志打印,代码比较简单. 异常日志处理类 package com.apt.study.exception; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation

spring Aop 注解

个人理解: spring Aop 是什么:面向切面编程,类似于自定义拦截操作,支持拦截之前操作@Before,拦截之后操作@After,拦截环绕操作@Around. 什么情况下使用spring Aop:举例如下 当需要统计某些方法 or 指定xx开头的方法名 or 指定xx结尾的方法名 or 某些类下的方法 or 某些包下的方法 or 所有的方法的耗时统计或添加日志信息时,使用spring Aop 切面编程可以不用修改任何需要统计或添加日志的方法,只需很少一部分代码实现需要做的操作. 某交易系统