spring切面编程AOP 范例一
2015-12-17 16:55
357 查看
参照网上的spring AOP编程实例进行配置,但是碰到了几个坑。这篇文章重点讲解一下我踩过的两个坑:
1.使用@Service自动装配的时候,基础扫描包配置要正确;
2.xml中切面配置中的execution表达式的匹配规则要注意;
applicationContext.xml中最初的配置:
<context:component-scan base-package="com.nuomi"/>
而我新建的包名是:com.baidu.nuomi.crm.mm,果然是不包含在基础包里面的,于是我在applicationContext.xml配置文件中又新加了下面这一行:
<context:component-scan base-package="com.baidu"/>
就可以了。第一个问题完美解决。
View Code
第三步:xml文件配置:
首先在spring相关的配置文件中新建一个spring-aspect.xml文件:
然后在applicationContext.xml文件中引入上面的配置文件:
第四步:写个单测用例看一下配置是否成功了(我用的是junit)
下面是我的单测用例:
运行结果如下:
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表达式
那应该是我的表达式不正确。参考文章:http://lavasoft.blog.51cto.com/62575/172292/
我想要在包asp中的定义的任意方法上执行切面类,就按照对应的规则去配置才可以成功的。
新手可以参考上面的配置,有问题可以留言。
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.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 + ")"); } }
View Code
第三步: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中的定义的任意方法上执行切面类,就按照对应的规则去配置才可以成功的。
新手可以参考上面的配置,有问题可以留言。
相关文章推荐
- java设计模式----建造者模式
- struts2的基本配置
- java文件上传和下载
- spring mvc 中Uploadify插件的使用
- spring详细配置讲解
- Spring 配置log4j和简单介绍Log4J的使用
- 【Struts2】自定义局部类型转换器
- Java-Logger简单使用
- 记录java异常
- Eclipse导入Erlang项目出现乱码 如何解决
- java.util.logging.Logger使用详解
- Struts2 XML配置详解
- JAVA IO (一) 基础深入理解
- java操作Hbase--增删查
- JAVA NIO(二)基础 内存管理 文件锁定 Socket服务器客户端通信
- Failed to load JavaHL Library解决方法
- 身份证验证格式。Java
- Java多线程之----Phaser
- SpringMVC web配置
- Android Studio 以及 Eclipse(1)--Module