Spring aop 简单示例
简单的记录一下spring aop的一个示例
基于两种配置方式:
基于xml配置
基于注解配置
这个例子是模拟对数据库的更改操作添加事物
其实并没有添加,只是简单的输出了一下记录
首先看下整个例子的目录图

全部代码就不贴了,数目有点多,不过很简单,看一部分就能够明白
第一种配置方式
基于xml方式配置
首先将service,dao注册到spring容器

配置一下扫描包还是很方便的
接下来看下service
package com.yangxin.core.service.impl; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.yangxin.core.dao.UserDao;
import com.yangxin.core.pojo.User;
import com.yangxin.core.service.UserService; @Service
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao; @Override
public void addUser(User user) {
userDao.insertUser(user);
System.out.println("添加成功");
} @Override
public void deleteUser(String name) {
userDao.deteleUser(name);
System.out.println("删除成功");
} }
要做的事情很简单,插入一条数据,删除一条数据
接下来看下切面代码
package com.yangxin.core.transaction;
import org.aspectj.lang.ProceedingJoinPoint;
import com.yangxin.core.pojo.User;
public class TransactionDemo {
//前置通知
public void startTransaction(){
System.out.println("begin transaction ");
}
//后置通知
public void commitTransaction(){
System.out.println("commit transaction ");
}
//环绕通知
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("begin transaction");
joinPoint.proceed();
System.out.println("commit transaction");
}
}
然后看下这个切面在applicationContext.xml中是如何配置的

<aop:config>
<aop:pointcut expression="execution(* com.yangxin.core.service.*.*.*(..))" id="p1" /> <aop:aspect ref = "transactionDemo"> <aop:before method="startTransaction" pointcut-ref="p1" /> <aop:after-returning method="commitTransaction" pointcut-ref="p1"/> </aop:aspect>
</aop:config>
这里没有演示环绕通知
好了,运行测试代码
测试代码如下
@Test
public void test1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml"); UserService userService = applicationContext.getBean(UserService.class); User user = new User(); user.setAge(19);
user.setName("yangxin"); userService.addUser(user);
userService.deteleUser("yangxin"); }
控制台输出如下
begin transaction
添加成功
commit transaction
begin transaction
删除成功
commit transaction
现在来测试一下环绕通知
修改一下applicationContext.xml中的配置切面那一部分
修改后的代码
<aop:config>
<aop:pointcut expression="execution(* com.yangxin.core.service.*.*.*(..))" id="p1" /> <aop:aspect ref = "transactionDemo"> <aop:around method="around" pointcut-ref="p1"/> </aop:aspect>
</aop:config>
运行测试代码
输出如下
begin transaction
添加成功
commit transaction
begin transaction
删除成功
commit transaction
好了,现在贴下如何用注解的方法
贴下基于注解的切面的代码
package com.yangxin.core.transaction; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut; @Aspect
public class TransactionDemo2 { @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")
public void point(){ } @Before(value="point()")
public void before(){
System.out.println("transaction begin");
} @AfterReturning(value = "point()")
public void after(){
System.out.println("transaction commit");
} @Around("point()")
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("transaction begin");
joinPoint.proceed();
System.out.println("transaction commit"); }
}
在applicationContext.xml中配置
<bean id = "transactionDemo2" class = "com.yangxin.core.transaction.TransactionDemo2" />
<aop:aspectj-autoproxy />
测试步骤和以上一致,这里就不贴了
完毕
记一下使用javaConfig配置方式的一些坑
以上 切面 不管是基于注解的还是基于xml配置的 这里把切面加载到容器中都是用xml配置bean的方式
如果用javaConfig方式的话
需要在配置类上加上 @EnableAspectJAutoProxy 注解
然后如果使用扫包的方式配置切面bean的话
切面上除了要加上@Aspect注解标识为这是一个切面bean之外
还需要在上面加上@component这个注解
很急很关键
排错的时候只关注切点表达式的问题了
当时一直在找切点表达式的问题
其实这个表达式写的是没有问题的
是配置切面bean的时候出的问题
深坑
Spring aop 简单示例的更多相关文章
- Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现
转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...
- Spring AOP 简单入门笔记 (转)
分享一个自己写的最为简单的Spring AOP的应用,其实,本人也是学习Spring不久,只是把一些个人的理解分享下,供参考.可能很多人刚开始不太理解到底啥是AOP,其实它也是相对 OOP来说的,类似 ...
- 【Spring】简单的Spring AOP注解示例
引入相关包: <properties> <spring.version>3.0.5.RELEASE</spring.version> <aspectj.ver ...
- spring aop简单日志实例
转载自:http://www.blogjava.net/laoding/articles/242611.html 一直就用spring的IOC,遗憾spring的另一重要组成部分AOP却没用过,所以近 ...
- spring AOP简单入门
AOP(aspect oriented programming)面向切面编程. 大致意思是在方法的执行过程中织入其他要执行的方法. 项目结构图 先介绍一下通过代理的方式实现aop,几个文件和上一篇一样 ...
- Spring AOP 简单应用,对请求参数进行拦截处理
AOP的主要角色 切面:使用切点表达式表示,指定了当前切面逻辑所要包裹的业务模块的范围大小: Advice:也即切面逻辑,指定了当前用于包裹切面指定的业务模块的逻辑 Advice的主要类型 @Befo ...
- spring aop简单理解
aop原理是spring帮我们封装了动态代理,然后我们只管写具体的业务,我们将公共业务也写到具体的一个类中并实现spring为我们提供的对应要连接切入哪个位置的接口,然后再xml中配置它们的关系即可. ...
- MyEclipse2014快速配置Spring & Spring Testing, Spring AOP简单使用
1.新建项目 2.右击项目,如图,利用myeclipse自动导入spring 3.在弹出的对话框中一直next到最后,在最后的页面中勾选Spring Testing,完成. 4.在src下的appli ...
- spring AOP简单实现代码存放
@Before:使用Before增强处理只能在目标方法执行之前织入增强,如果Before增强处理没有特殊处理,目标方法总会自动执行,如果Before处需要阻止目标方法的执行,可通过抛出一个异常来实现. ...
随机推荐
- 20145219 《Java程序设计》第06周学习总结
20145219 <Java程序设计>第06周学习总结 教材学习内容总结 InputStream与OutputStream 串流设计 1.串流:Java将输入/输出抽象化为串流,数据有来源 ...
- 一个问题:C#引用类型传参,说出你的答案
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { People p = new Peo ...
- win7 vmware虚拟机上网设置
1.上网方式设成HOST-ONLY 2.将主机的网络共享VMnet1(完成第一步设置后,VMware自动分配虚拟网络VMnet1) 3.win7下查看VMnet1网络ip 4.根据3查看的IP地址在v ...
- HIVE- SCD缓慢变化
SCD缓慢变化维,比如一个用户维表,用户属性会变化,但是不会变化很剧烈,可能一年只会变化一两次,也不会所有用户的属性都会有变化,只有少量的数据发生变化,所以叫缓慢变化维.这种问题就是由于维度的变化所造 ...
- Android 通过名称获取资源ID
当我们获取网络数据的时候,解析之后往往都是一个字符串,而不是资源id,所有我们没有办法直接使用,只能通过名称来获取到资源id, package com.example.administrator.de ...
- Django进阶Template篇002 - 模板包含和继承
包含 {% include %} 允许在模板中包含其他模板的内容. {% include "foo/bar.html" %} {% include template_name %} ...
- Sublime Text C# 编译(csharp.sublime-build)
制作: 1. 配置环境变量PATH C# 7.0 C:\Program Files (x86)\Microsoft Visual Studio\\Enterprise\MSBuild\15.0\Bin ...
- ASP.NET Core 简单引入教程
0.简介 开源.跨平台 1.环境安装 参考官方教程 Core 官方文档 2.向世界问个好 sheel/cmd 下: dotnet --help // 查看帮助 dotnet new * / ...
- TCP/UDP编程步骤和区别
一. 概念解析 套接字:一种特殊的文件描述符.一头指向套接字地址(用户),一头指向套接字结构(内核). 套接字结构:由内核维持的一种数据结构,可通过套接字来操作. 套接字地址:ip和port. 二. ...
- C语言小知识点汇集
1. 三元表达式“?:”冒号两边的两个操作数类型必须一致. 2. 枚举变量的sizeof值同int型一样为4. 3. 为了消除不必要的计算 &&两侧的表达式,当左侧即第1个表达式不成立 ...