博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
aop的简单使用(代码和配置记录)
阅读量:6428 次
发布时间:2019-06-23

本文共 3712 字,大约阅读时间需要 12 分钟。

简单的记录一下spring aop的一个示例

基于两种配置方式:

      基于xml配置

      基于注解配置

这个例子是模拟对数据库的更改操作添加事物

其实并没有添加,只是简单的输出了一下记录

 

首先看下整个例子的目录图

  

全部代码就不贴了,数目有点多,不过很简单,看一部分就能够明白

 

第一种配置方式

  基于xml方式配置

  首先将service,dao注册到spring容器

  

  配置一下扫描包还是很方便的

  接下来看下service

  

1 package com.yangxin.core.service.impl; 2  3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 import com.yangxin.core.dao.UserDao; 7 import com.yangxin.core.pojo.User; 8 import com.yangxin.core.service.UserService; 9 10 @Service 11 public class UserServiceImpl implements UserService { 12 13 @Autowired 14 private UserDao userDao; 15 16 @Override 17 public void addUser(User user) { 18 userDao.insertUser(user); 19 System.out.println("添加成功"); 20 } 21 22 @Override 23 public void deleteUser(String name) { 24 userDao.deteleUser(name); 25 System.out.println("删除成功"); 26 } 27 28 }

要做的事情很简单,插入一条数据,删除一条数据

 

接下来看下切面代码

1 package com.yangxin.core.transaction; 2  3 import org.aspectj.lang.ProceedingJoinPoint; 4 5 import com.yangxin.core.pojo.User; 6 7 public class TransactionDemo { 8 9 //前置通知 10 public void startTransaction(){ 11 System.out.println("begin transaction "); 12 } 13 14 //后置通知 15 public void commitTransaction(){ 16 System.out.println("commit transaction "); 17 } 18 19 //环绕通知 20 public void around(ProceedingJoinPoint joinPoint) throws Throwable{ 21 System.out.println("begin transaction"); 22 23 joinPoint.proceed(); 24 25 System.out.println("commit transaction"); 26 } 27 28 }

然后看下这个切面在applicationContext.xml中是如何配置的

 

1 
2
3 4
5 6
7 8
9 10
11

这里没有演示环绕通知

好了,运行测试代码

测试代码如下

1   @Test 2     public void test1(){ 3 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml"); 4 5 UserService userService = applicationContext.getBean(UserService.class); 6 7 User user = new User(); 8 9 user.setAge(19); 10 user.setName("yangxin"); 11 12 userService.addUser(user); 13 userService.deteleUser("yangxin"); 1415 16 }

控制台输出如下

  begin transaction

  添加成功

  commit transaction

  begin transaction

  删除成功

  commit transaction

现在来测试一下环绕通知

修改一下applicationContext.xml中的配置切面那一部分

修改后的代码

1 
2
3 4
5 6
7 8
9

运行测试代码

输出如下

begin transaction

添加成功
commit transaction
begin transaction
删除成功
commit transaction

 

好了,现在贴下如何用注解的方法

贴下基于注解的切面的代码

1 package com.yangxin.core.transaction; 2  3 import org.aspectj.lang.ProceedingJoinPoint; 4 import org.aspectj.lang.annotation.AfterReturning; 5 import org.aspectj.lang.annotation.Around; 6 import org.aspectj.lang.annotation.Aspect; 7 import org.aspectj.lang.annotation.Before; 8 import org.aspectj.lang.annotation.Pointcut; 9 10 @Aspect 11 public class TransactionDemo2 { 12 13 @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))") 14 public void point(){ 15 16 } 17 18 @Before(value="point()") 19 public void before(){ 20 System.out.println("transaction begin"); 21 } 22 23 @AfterReturning(value = "point()") 24 public void after(){ 25 System.out.println("transaction commit"); 26 } 27 28 @Around("point()") 29 public void around(ProceedingJoinPoint joinPoint) throws Throwable{ 30 System.out.println("transaction begin"); 31 joinPoint.proceed(); 32 System.out.println("transaction commit"); 33 34 } 35 }

在applicationContext.xml中配置

1 
1 

测试步骤和以上一致,这里就不贴了

 

完毕

 

记一下使用javaConfig配置方式的一些坑

 

以上 切面 不管是基于注解的还是基于xml配置的   这里把切面加载到容器中都是用xml配置bean的方式

 

如果用javaConfig方式的话

 

需要在配置类上加上 @EnableAspectJAutoProxy 注解

 

然后如果使用扫包的方式配置切面bean的话

切面上除了要加上@Aspect注解标识为这是一个切面bean之外

还需要在上面加上@component这个注解

很急很关键

排错的时候只关注切点表达式的问题了

当时一直在找切点表达式的问题

其实这个表达式写的是没有问题的

是配置切面bean的时候出的问题

深坑

转载于:https://www.cnblogs.com/xwjBlog/p/7677206.html

你可能感兴趣的文章
随机选择
查看>>
【Java并发编程三】闭锁
查看>>
分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法
查看>>
让你的Git水平更上一层楼的10个小贴士
查看>>
c++ string 之 find_first_not_of 源码
查看>>
mybatis中的#和$的区别
查看>>
ubuntu下搭建NDK环境
查看>>
MessageDigest简单介绍
查看>>
webpack window 使用sass来编译css样式
查看>>
D3 & Data Visualization in Ext JS
查看>>
java通过UUID生成16位唯一订单号
查看>>
001-web基本程序搭建
查看>>
函数指针和指针函数
查看>>
Intel 揭秘:如何在公有云、混合云和私有云间合理放置工作负载
查看>>
借力AI 极验如何构建下一代业务安全?
查看>>
用Python制作迷宫GIF
查看>>
支付宝推出基于区块链跨境支付,巨头入场小企业将面临灭顶之灾
查看>>
从事互联网行业,怎样才能快速掌握一门编程语言呢?
查看>>
谈谈fail-fast与fail-safe是什么以及工作机制
查看>>
深入浅出换肤相关技术以及如何实现
查看>>