spring切面编程AOP 范例一
参照网上的spring AOP编程实例进行配置,但是碰到了几个坑。这篇文章重点讲解一下我踩过的两个坑:
1.使用@Service自动装配的时候,基础扫描包配置要正确;
2.xml中切面配置中的execution表达式的匹配规则要注意;
针对第一个问题
是我发现我新建的一个包里面写了一个接口和这个接口的实现,在接口实现上使用@Service,那么在使用这个service的时候,bean会自动注入进来的,但是我写的单测用例一直提示我bean注入失败。我写的其他包里的service就可以正常使用。我突然想起来,spring要识别@Service,是需要扫描基础包的,那应该是我的基础包配置没有将我新建的这个包包含进去。
applicationContext.xml中最初的配置:
<context:component-scan base-package="com.nuomi"/>
而我新建的包名是:com.baidu.nuomi.crm.mm,果然是不包含在基础包里面的,于是我在applicationContext.xml配置文件中又新加了下面这一行:
<context:component-scan base-package="com.baidu"/>
就可以了。第一个问题完美解决。
下面说下第二个问题
第一步:写好切面类:
package com.baidu.nuomi.crm.helper.monitorproxy.aspect; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; /**
* @author sonofelice
* @version 2015年12月17日 下午1:21:46 类说明 :
*/
public class ProxyAspect {
public void doAfter(JoinPoint jp) {
System.out.println("log Ending method:" + jp.getTarget().getClass().getName() + "."
+ jp.getSignature().getName());
} public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long time = System.currentTimeMillis();
Object retVal = pjp.proceed();
time = System.currentTimeMillis() - time;
System.out.println("process time:" + time + "ms");
return retVal;
} public void doBefore(JoinPoint jp) {
System.out.println("long Beginning methoe:" + jp.getTarget().getClass().getName() + "."
+ jp.getSignature().getName());
} public void doThrowing(JoinPoint jp, Throwable ex) {
System.out.println("methoe" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName()
+ " throw exception");
System.out.println(ex.getMessage());
}
}
第二步:写好切面要织入的目标对像:
接口和其对应的实现:
package com.baidu.nuomi.crm.target.asp; /**
* @author sonofelice
* @version 2015年12月17日 下午2:49:20 类说明 :
*/
public interface AService { public void barA(); public void fooA(String _msg);
} package com.baidu.nuomi.crm.target.asp; import org.springframework.stereotype.Service; /**
* @author sonofelice
* @version 2015年12月17日 下午3:41:05 类说明 :
*/
@Service("aService")
public class AServiceImp implements AService { @Override
public void barA() {
System.out.println("AServiceImpl.barA()");
} @Override
public void fooA(String _msg) {
System.out.println("AServiceImpl.fooA(msg:" + _msg + ")");
} }
第三步:xml文件配置:
首先在spring相关的配置文件中新建一个spring-aspect.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
">
<bean id="proxyAspect" class="com.baidu.nuomi.crm.helper.monitorproxy.aspect.ProxyAspect"/>
<aop:config>
<aop:aspect id="doOpAspect" ref="proxyAspect">
<aop:pointcut id="entrance" expression="execution(* com.baidu.nuomi.crm.target.asp.*.*(..))" />
<aop:before pointcut-ref="entrance" method="doBefore"/>
<aop:after pointcut-ref="entrance" method="doAfter"/>
<aop:around pointcut-ref="entrance" method="doAround"/>
<aop:after-throwing pointcut-ref="entrance" method="doThrowing" throwing="ex"/>
</aop:aspect>
</aop:config>
</beans>
然后在applicationContext.xml文件中引入上面的配置文件:
<import resource="spring-monitorproxy.xml" />
第四步:写个单测用例看一下配置是否成功了(我用的是junit)
下面是我的单测用例:
public class BServiceTest extends BaseTest {
@Autowired
AService aService;
@Test
public void test() {
aService.barA();
aService.fooA("msg");
}
}
运行结果如下:
long Beginning methoe:com.baidu.nuomi.crm.target.asp.AServiceImp.barA
AServiceImpl.barA()
process time:0ms
log Ending method:com.baidu.nuomi.crm.target.asp.AServiceImp.barA
long Beginning methoe:com.baidu.nuomi.crm.target.asp.AServiceImp.fooA
AServiceImpl.fooA(msg:msg)
process time:0ms
log Ending method:com.baidu.nuomi.crm.target.asp.AServiceImp.fooA
当然,一开始肯定不是这么顺利的出结果的。切面类中的方法中打印的东西在我的控制台中一条都没有打印,这是为什么呢?肯定是切面类没有织入到目标类里面啊。仔细检查下配置文件,跟借鉴的别人的配置是一样的,配置第一行,都是先配置切面类的bean,不同的地方就是这个execution表达式
<aop:pointcut id="entrance" expression="execution(* com.baidu.nuomi.crm.target.asp.*.*(..))" />
那应该是我的表达式不正确。参考文章:http://lavasoft.blog.51cto.com/62575/172292/
任意公共方法的执行:
execution(public * *(..))
任何一个名字以“set”开始的方法的执行:
execution(* set*(..))
AccountService接口定义的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
在service包中定义的任意方法的执行:
execution(* com.xyz.service.*.*(..))
在service包或其子包中定义的任意方法的执行:
execution(* com.xyz.service..*.*(..))
我想要在包asp中的定义的任意方法上执行切面类,就按照对应的规则去配置才可以成功的。
新手可以参考上面的配置,有问题可以留言。
spring切面编程AOP 范例一的更多相关文章
- Spring切面编程AOP
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- spring框架(2)— 面相切面编程AOP
spring框架(2)— 面相切面编程AOP AOP(Aspect Oriented Programming),即面向切面编程. 可以说是OOP(Object Oriented Programming ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
随机推荐
- 美丽的Java图表类库
摘要 在使用java做后台站点的开发张,图表和报表功能都是不可或缺 的.本文推荐了8款最精彩实用的Java图表应用,大部分图表应用的功能都类似,主要在于界面的美观性和使用的灵活性上有一点高低. 正文 ...
- Codeforce 712A Memory and Crow
A. Memory and Crow time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...
- 【死磕Java并发】-----深入分析volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized.如果一个变量使用volatile,则它 ...
- C#操作XML方式
前言 前一篇XML读取,现在咱们继续XML操作相关 C#中也有三种操作(增.删.改.查)XML文件方法如下: 使用 XmlDocument(DOM模式) 使用 XmlTextWriter(流模式) 使 ...
- 使用bootstrap table小记(表格组件)
前言 新的一年悄然到来,生活依旧.最近一周大热的赵雷风,一首<成都>,一首<理想>再次把民谣展示在国人面前.歌词着实写的不错. 理想,你今年几岁 你总是诱惑着年轻的朋友 你总是 ...
- sqlite数据库学习
1.0版代码: package com.swust.sqlitedatabase.test; import com.swust.sqlitedatabase.myOpenHelper; import ...
- Monit:开源服务器监控工具
Monit是一个跨平台的用来监控Unix/linux系统(比如Linux.BSD.OSX.Solaris)的工具.Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不依赖任何第三方程序 ...
- C# GDI绘图之——画笔和画刷
绘制图形需要画笔和画刷: Pen(画笔类): Pen为C#编程语言中专门的画笔类 使用方式: // 用系统颜色来初始化我们的画笔类,使用Color静态类中的颜色 1. Pen p1 = new Pen ...
- 深度神经网络(DNN)模型与前向传播算法
深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础,而要理解DNN,首先我们要理解DNN模型,下面我们就对DNN的模型与前向传播算法做一个总结. 1. 从感知机 ...
- Win7配置IIS7
1.安装 控制面板\程序\程序和功能\打开或关闭Windows功能 选择Internet信息服务勾选相应的内容 2.打开iis信息服务管理器 点击菜单\运行(WIN+R) 输入iis 如图所示 可 ...