开发者社区> 必须往前走> 正文

使用aspectJ实现Spring AOP的两种方式

简介: 方式一:基于aspectJ的XML配置 方式二:基于aspectJ的注解方式 基于aspectJ的XML配置 1)       引入相关jar包     2)       创建Spring核心配置文件,必须导入aop的约束   3)       使用表达式配置切入点 [1] 切入点:实际增强的方法 [2] execution(?()) 表达式的几种写法: ①execution (* cn.
+关注继续查看

 

方式一:基于aspectJ的XML配置

方式二:基于aspectJ的注解方式

基于aspectJ的XML配置

1)       引入相关jar

 

 

2)       创建Spring核心配置文件,必须导入aop的约束

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      
xmlns:aop="http://www.springframework.org/schema/aop"
      
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>

3)       使用表达式配置切入点

[1] 切入点:实际增强的方法

[2] execution(<访问修饰符>?<返回值类型><方法名全路径>(<从参数>)<异常>)

表达式的几种写法:

①execution (* cn.aop.Book.add(..))对cn.aop包下的Book类中的所有方法名为add的方法进行增强

 

 *:表示可以是任意访问修饰符

cn.aop.Book.add:方法的全路径

(..):表示可以有参数,也可以没有

                   ②execution (*  cn.aop.Book.*(..))对cn.aop包下的Book类中的所有方法进行增强

                   ③execution(* *.*(..))对所有包下的所有类中的所有方法进行增强

                   ④execution(* save*(..))对所有以save开头的方法进行增强

 

 

前置增强实例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      
xmlns:aop="http://www.springframework.org/schema/aop"
      
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--1 配置对象(创建对象)-->
   
<bean id="book" class="cn.bdqn.SpringAspectJ.Book"/>
    <bean id="mybook" class="cn.bdqn.SpringAspectJ.Mybook"/>
    <!--2 配置aop操作-->
   
<aop:config>
        <!--2.1配置切入点-->
       
<aop:pointcut expression="execution(* cn.SpringAspectJ.Book.*(..))" id="pointcut1"/>
        <!--2.2配置切面
        把增强用到方法上面
,要指定哪个增强-->
       
<aop:aspect ref="mybook">
            <!--配置增强类型
            method:
增强类里面使用哪个方法作为前置增强-->
           
<aop:before method="before" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>

</beans>

 

4)       编写测试类

public class Test {
    @org.junit.Test
    public void test(){
     Book book= (Book) new ClassPathXmlApplicationContext("beans.xml").getBean("book");
     book.add();
    }
}

 

测试结果如下:

 

 

后置增强实例和前置一样

环绕增强:

 

需要增强的类

public class Book {
    public  void add(){
        System.out.println("add.........");
    }
}

 

 

增强类中的方法::

public void around(ProceedingJoinPoint proceedingJoinPoint){
    //方法之前
   
System.out.println("方法之前...");
    //执行被增强的方法
   
try {
        proceedingJoinPoint.proceed();
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    //方法之后
   
System.out.println("方法之后");
}

 

 

XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      
xmlns:aop="http://www.springframework.org/schema/aop"
      
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--1 配置对象-->
   
<bean id="book" class="cn.bdqn.SpringAspectJ.Book"/>
    <bean id="mybook" class="cn.bdqn.SpringAspectJ.Mybook"/>
    <!--2 配置aop操作-->
   
<aop:config>
        <!--2.1配置切入点-->
       
<aop:pointcut expression="execution(* cn.bdqn.SpringAspectJ.Book.*(..))" id="pointcut1"/>
        <!--2.2配置切面
        把增强用到方法上面
,要指定哪个增强-->
       
<aop:aspect ref="mybook">
            <!--配置增强类型
            method:
增强类里面使用哪个方法作为前置增强-->

           
<aop:around method="around" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>
</beans>

 

 

测试类

public class Test {
    @org.junit.Test
    public void test(){
     Book book= (Book) new ClassPathXmlApplicationContext("beans.xml").getBean("book");
     book.add();
    }
}

执行效果

 

 

方式二: 基于aspectJ的注解方式

1)       引入相关jar

2)       创建Spring核心配置文件,必须导入aop的约束

以上两步骤直接参照基于aspectJ的XML配置方式

3)       在Spring配置文件中开启aop操作

 

4)       在增强类上面加上@Aspectj的注解

在增强的方法上面加上@before注解 @before是前置增强

 

5)       创建test类,运行效果如下

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Spring技术实战】Spring框架中Aspectj和LoadTimeWeaving的动态代理技术实现指南
【Spring技术实战】Spring框架中Aspectj和LoadTimeWeaving的动态代理技术实现指南
61 0
Spring AOP 与 AspectJ
前言 Spring AOP 主要具有三种使用方式,分别是注解、XML 配置、API,目前在 Spring 中,由于 XML 需要大量配置,注解已经逐步取代 XML 配置,而 API 需要对 Spring 底层具有较深入的了解才能使用,因此注解成了应用 Spring 的首选方式。
46 0
Spring系列八:Spring AOP 和 AspectJ AOP 区别
该文章收录专栏: 叶秋学长的Spring系列专栏 博主传送门: 叶秋学长 Spring AOP 和 AspectJ AOP 区别? 今天由叶秋学长带领大家学习Spring AOP和AspectJ AOP 的区别~~ Spring AOP Spring AOP 属于运行时增强,主要具有如下特点: 1. 基于动态代理来实现,默认如果使用接口的,用 JDK 提供的动态代理实现,如果是方法则使用 CGLIB 实现 2. Spring AOP 需要依赖 IOC 容器来管理,并且只能作用于 Spring 容器,使用纯 Java 代码实现 3. 在性能上,由于 Spring AOP 是基于
118 0
Spring——Spring中的事务、使用注解(@Transactional)控制事务、使用AspectJ框架控制事务 (下)
Spring——Spring中的事务、使用注解(@Transactional)控制事务、使用AspectJ框架控制事务 (下)
87 0
Spring——Spring中的事务、使用注解(@Transactional)控制事务、使用AspectJ框架控制事务 (上)
Spring——Spring中的事务、使用注解(@Transactional)控制事务、使用AspectJ框架控制事务 (上)
139 0
Spring全家桶之Spring核心篇,AspectJ框架基于注解的 AOP 实现
Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。
57 0
Spring基于AspectJ实现AOP操作
Spring基于AspectJ实现AOP操作
36 0
Spring - AOP之AspectJ(XML)
Spring - AOP之AspectJ(XML)
42 0
Spring - AOP之AspectJ(注解)
Spring - AOP之AspectJ(注解)
39 0
动力节点-Spring使用AspectJ实现AOP前置通知
AspectJ 是一个面向切面的框架,它扩展了 Java 语言。AspectJ 定义了 AOP 语法,它有一个专门的编译器用来生成遵守 Java 字节编码规范的 Class 文件。
110 0
+关注
必须往前走
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多