Spring @Aspect 全注解完成AOP测试

最近刚刚好在看spring in action 第四版,针对aop这一章节做练习测试,但遇到了一个问题,头一天晚上始终没能解决,第二天早上"灵光一现",改动一下做了测试,就通过了,也正如我所想,我还是太粗心大意了.

先看代码:

package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration //表明是配置类
@EnableAspectJAutoProxy//启用AspectJ自动代理
@ComponentScan//扫描当前类所在的基础包
public class CDPlayerConfig {
}


package soundsystem;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;


@Aspect //切面
public class CDAspect {

@Before("execution(** soundsystem.CompactDisc.play(. .))") //前置通知, 括号内的为切入点
public void before2Aspect(){
System.out.println("before2Aspect");
}
@After("execution(** soundsystem.SgtPeppers.play(. .))")//后置通知
public void before3Aspect(){
System.out.println("before3Aspect");
}
}


//接口

package soundsystem;
public interface CompactDisc {
void play();
}

//接口实现

package soundsystem;
import org.springframework.stereotype.Component;

@Component("sgt")
public class SgtPeppers implements CompactDisc{
public void play() {
System.out.println(this);
}
}



//测试类

package soundsystem;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {

@Autowired
private CompactDisc cd;

@Test
public void play(){
cd.play();
}
}

测试以上代码,是没有任何错误提示,绿色通过,但是,始终前置通知和后置通知的打印没起效果,

分析:

1.分析是@Aspect注解标示的类没有起作用, 仔细前置和后置括弧内的指示器(execution)语法配置,   没有错误

2.网上查询关于@Aspect注解的使用,但没查到关于全注解测试案例,查询到的基本都是junit测试加载xml的做法, bean和注解开启功能都是在xml中进行配置, 并摘抄了一个案例到本地进行测试,测试通过,对比本地,感觉没差异, 舍友让走就一起走了(不然我肯定还要多测试两次)

3.晚上都是带着疑问的,第二天早上仔细思考和xml配置的差异, 最终发现我配置了切面,但是切面对应的pojo没有声明@Component, 也就是切面的pojo没有让spring给创建bean,然后再仔细翻这一章节, 果然,在CDAspect 上添加@Component注解后,测试通过,

输出结果:

before2Aspect
soundsystem.SgtPeppers@b05acd
before3Aspect


回顾: 还是学习得比较"粗糙",也学得比较肤浅, 再回顾一下AOP的实质:

定义一个通用的功能,通过声明的方式定义这个功能在何处使用,而无需修改受影响的类,让代码之间更少耦合.

将切面类声明为spring的bean之后,就可以的原理: 我在书中找到的解释,并理解

AspectJ切面根本不需要spring就可以织入到我们的应用中, 为了使用Spring的依赖注入为AspectJ切面注入协作者,就需要在Spring的配置中将切面声明的同时并声明为bean;

不管是注解还是xml配置,AspectJ自动代理会为使用@Aspect的注解的bean创建一个代理,这个代理会包含所有该切面的切点所匹配的bean.并在目标方法执行的前后调用通知方法,执行额外的逻辑;

以前为了快速入门, 通过看视频 ,很快的学会怎么使用,都是知其然不知其所以然, 现在回过头来看书本, 收获也蛮大的, 

谨记: 别偷懒,出来混迟早要还的  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值