在做项目的时候遇到这样一个问题,需要在service层进行动态数据源的切换,因此,在service层定义了一个切面,只要方法进入我就判断参数,通过一个参数来进行数据源的切换,但是后来发现在同一个类中进行方法的调用的时候,切面就进不去了。
话不多说,代码是最好的语言:
1、切面类
public class Minstrel {
/**
* 切面开始方法
*/
public void singBeforeQuest(){
System.out.println("Minstrel....singBeforeQuest....begain");
}
/**
* 界面的结束方法
*/
public void singAfterQuest(){
System.out.println("Minstrel....singAfterQuest....after");
}
public void destoryName(){
System.out.println("Minstrel....destoryName....going");
}
}
2、方法调用类
public class BraveKnight {
private Quest quest;
//构造函数
public BraveKnight(Quest quest){
this.quest = quest;
}
//无参构造函数
public BraveKnight(){
}
//需要测试的方法
public void embarkOnQuest(){
quest.embark();
}
public void test(){
BraveKnight aop = (BraveKnight) AopContext.currentProxy();
aop.test1();
aop.embarkOnQuest();
}
public void test1(){
BraveKnight aop = (BraveKnight) AopContext.currentProxy();
aop.embarkOnQuest();
}
public void destoryName(){
System.out.println("Quest...............destoryName....................going");
}
}
3、切面配置
<!-- 定义aop切面 -->
<aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true"/>
<aop:config>
<aop:aspect ref="minstrel">
<aop:pointcut expression="execution(* com.spring.knights.*.*(..))" id="embark"/>
<aop:before method="singBeforeQuest" pointcut-ref="embark"/>
<aop:after method="singAfterQuest" pointcut-ref="embark"/>
</aop:aspect>
</aop:config>
- <aop:aspectj-autoproxy proxy-target-class="true"expose-proxy="true"/>
java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
相关信息参考:http://blog.csdn.net/z69183787/article/details/45622821
此处要着重注意:AopContext