【学习笔记】Spring AOP注解使用总结

 

Spring AOP基本概念

  1. 是一种动态编译期增强性AOP的实现
  2. 与IOC进行整合,不是全面的切面框架
  3. 与动态代理相辅相成
  4. 有两种实现:基于jdk动态代理、cglib

Spring AOP与AspectJ区别

  1. Spring的AOP是基于动态代理的,动态增强目标对象,而AspectJ是静态编译时增强,需要使用自己的编译器来编译,还需要织入器
  2. 使用AspectJ编写的java代码无法直接使用javac编译,必须使用AspectJ增强的ajc增强编译器才可以通过编译,写法不符合原生Java的语法;而Spring AOP是符合Java语法的,也不需要指定编译器去编译,一切都由Spring 处理。

JDK动态代理与Cglib的区别

  1. jdk的动态代理需要实现接口 InvocationHandler
  2. cglib无需实现接口,使用字节码技术去修改class文件使继承
  3. spring默认使用jdk动态代理,如果没有实现接口会使用cglib

使用步骤

  1. 定义业务组件
  2. 定义切点(重点)
  3. 定义增强处理方法(切面方法)

依赖

jar包依赖,除此以外还有spring依赖

  1. aspectjweaver.jar
  2. aspectjrt.jar
  3. aspectj.jar
  4. aopalliance.jar

maven依赖

    <dependencies>         <!-- 有此依赖会远程下载其它相关依赖 -->         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-context</artifactId>             <version>4.2.9.RELEASE</version>         </dependency>         <!-- aspectJ AOP 织入器 -->         <dependency>             <groupId>org.aspectj</groupId>             <artifactId>aspectjweaver</artifactId>             <version>1.8.9</version>         </dependency>      </dependencies>

注解方式开发

  1. 扫描Aspect增强的类
<context:component-scan base-package="">     <context:include-filter type="annotation"         expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan>
  1. 开启@AspectJ支持 <aop:aspectj-autoproxy/>
  2. 使用@AspectJ注解来标记一个切面类(spring不会将切面注册为Bean也不会增强,但是需要扫描)
  3. 使用其它注解进行开发(如下)

常用注解的使用

  1. @Before:在切点方法前执行
    • 在增强的方法上@Before("execution(* 包名.*.*(..))")
    • 上述表达式可使用pointcut或切入表达式,效果一致,之后不再赘述
    • 切点方法没有形参与返回值

示例代码

@Aspect public class AuthAspect {          //定义切点     @Pointcut("execution(* com.cnblogs.hellxz.service.*.*(..))")  
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信