Spring aop 实例(转)
面向切面编程,有效的降低了代码之间的耦合性,易于维护;例如:我们习惯在代码中加上一些日志信息,在程序出错时方便快速查找找到问题,通常做法是在请求进入方法的时候打印日志,退出前打印日志,还有在出错时打印日志,那么问题就来了,每个方法中都需要打印日志,这些相同的部分就可以当做一个切面,通过配置切点来触发所需要的功能,比如,我需要在请求进入方法的时候打印,即可使用aop当中的前置通知来做到,这样就不需要每个方法中都去写一遍,配置好之后引用即可。
简单的记录一下spring aop的一个示例
基于两种配置方式:
1:基于xml配置
2:基于注解配置
这个例子是模拟对数据库的更改操作添加事物
其实并没有添加,只是简单的输出了一下记录
首先看下整个例子的目录图

全部代码就不贴了,数目有点多,不过很简单,看一部分就能够明白
第一种配置方式
基于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");
//调用process()方法才会真正的执行实际被代理的方法
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 />
测试步骤和以上一致,这里就不贴了
结合例子我们来看看这些核心的概念:
2.1、切面(Aspect):是一个类,里面定义了通知与切点。
2.2、切点(PointCut):表达式。就是告诉程序要在执行哪些核心业务的时候,执行非核心的业务。
2.3、通知(advice):五种通知方式:
@Before:前置通知,在调用目标方法之前执行通知定义的任务@After:后置通知,在目标方法执行结束后,无论执行结果如何都执行通知定义的任务@After-returning:后置通知,在目标方法执行结束后,如果执行成功,则执行通知定义的任务@After-throwing:异常通知,如果目标方法执行过程中抛出异常,则执行通知定义的任务@Around:环绕通知,在目标方法执行前和执行后,都需要执行通知定义的任务。
Spring aop 实例(转)的更多相关文章
- Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置
用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...
- Spring AOP实例——异常处理和记录程序执行时间
实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...
- Spring学习十四----------Spring AOP实例
© 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...
- Spring Aop实例
一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspe ...
- Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)
在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截.但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因.它允许你通过它的方法名来拦截方法.另外, ...
- Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置(转)
用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...
- Spring Aop实例之xml配置
AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; pu ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- Spring AOP 系列总括
Spring有两大核心,IOC和AOP.IOC在Java Web项目中无时无刻不在使用,然而AOP用的比较少,尤其是对一些初级程序员,在架构师搭好的框架上开发应用代码,AOP几乎是透明的.然而,项目中 ...
随机推荐
- SpringBoot与jackson.databind兼容报错问题
SpringBoot与jackson.databind兼容报错问题 ———————————————— 1.SpringBoot版本V2.0.0其依赖的jackson-databind版本为V2.9.4 ...
- SpringCloud 入门知识篇
SpringCloud 入门 springcloud 学习 7天学会springcloud 教程 https://www.cnblogs.com/skyblog/category/738524.htm ...
- React 项目中修改 Ant Design 的默认样式(Input Checkbox 等等
修改样式更符合项目的需求特别是在 Input 和 Checkbox 等等一系列 试过很的方式都有问题, 比如直接在行内添加样式会无法传递到特定的层级 最好的办法是添加 id 可行 渲染部分代码 < ...
- shell变量与运算
shell变量与运算 @(0003 shell编程) 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号.也就是说在内存中,标记变量的变量名称是str,而不 ...
- sqli-lab(15)
要考四级了 翻译过来就是 基于时间的单引号盲注 0X01盲注 的了解 https://www.cnblogs.com/ldhbetter/p/9201840.html 这里写的清清楚楚 A 先拆解长度 ...
- OI常用的常数优化小技巧
注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...
- 用Jquery选择器计算table中的某一列某一行的合计
核心算法: $('#tableId tr').each(function() { $(this).find('td:eq(columnIndex)').each(function() { totalA ...
- ef和ashx的简单测试
在这里.小弟我默默的计算了一下用一般处理程序和MVC配合EF,到底哪个快,事实问题是我感觉都差不多,因为用的是EF,所以要提高访问速率,我觉得还是要从数据访问做起: 一般处理程序代码: private ...
- 各种tips汇总
才疏学浅,以下整理的东西有些可能还不成熟,措辞有待改进,但是都是我在敲代码的过程中,一点一滴积累总结的,如有不妥和错误,希望大家指正. 让行及元素变成块级元素的方式: position:absolut ...
- 自定义配置节点configSections的使用
//App.config <?xml version="1.0" encoding="utf-8" ?><configuration> ...