您的位置:首页 > 编程语言 > Java开发

Spring学习笔记(15)-----------Spring转折点(2)

2015-05-05 08:41 295 查看
  利用方式一的配置起来,可见代码还是非常的厚重的,定义一个切面就要定义一个切面类,然而切面类中,就一个通知方法,着实没有必要。所以Spring提供了,依赖aspectj的schema配置和基于aspectj注解方式。这两种方式非常简介方便使用,也是项目中普遍的使用方式。梳理之:
4、方式二:schema配置
a、业务类:
[code]/**
*业务类
*
*/
publicclassAspectBusiness{

/**
*切入点
*/
publicStringdelete(Stringobj){
System.out.println("==========调用切入点:"+obj+"说:你敢删除我!===========\n");
returnobj+":瞄~";
}

publicStringadd(Stringobj){
System.out.println("================这个方法不能被切。。。==============\n");
returnobj+":瞄~嘿嘿!";
}

publicStringmodify(Stringobj){
System.out.println("=================这个也设置加入切吧====================\n");
returnobj+":瞄改瞄啊!";
}

}

b、切面类:切面类中,包含了所有的通知

/**
*定义一个切面
*
*@authoryanbin
*
*/
publicclassAspectAdvice{

/**
*前置通知
*
*@paramjp
*/
publicvoiddoBefore(JoinPointjp){
System.out.println("===========进入beforeadvice============\n");

System.out.print("准备在"+jp.getTarget().getClass()+"对象上用");
System.out.print(jp.getSignature().getName()+"方法进行对'");
System.out.print(jp.getArgs()[0]+"'进行删除!\n\n");

System.out.println("要进入切入点方法了\n");
}

/**
*后置通知
*
*@paramjp
*连接点
*@paramresult
*返回值
*/
publicvoiddoAfter(JoinPointjp,Stringresult){
System.out.println("==========进入afteradvice===========\n");
System.out.println("切入点方法执行完了\n");

System.out.print(jp.getArgs()[0]+"在");
System.out.print(jp.getTarget().getClass()+"对象上被");
System.out.print(jp.getSignature().getName()+"方法删除了");
System.out.print("只留下:"+result+"\n\n");
}

/**
*环绕通知
*
*@parampjp
*连接点
*/
publicvoiddoAround(ProceedingJoinPointpjp)throwsThrowable{
System.out.println("===========进入around环绕方法!===========\n");

//调用目标方法之前执行的动作
System.out.println("调用方法之前:执行!\n");

//调用方法的参数
Object[]args=pjp.getArgs();
//调用的方法名
Stringmethod=pjp.getSignature().getName();
//获取目标对象
Objecttarget=pjp.getTarget();
//执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
Objectresult=pjp.proceed();

System.out.println("输出:"+args[0]+";"+method+";"+target+";"+result+"\n");
System.out.println("调用方法结束:之后执行!\n");
}

/**
*异常通知
*
*@paramjp
*@parame
*/
publicvoiddoThrow(JoinPointjp,Throwablee){
System.out.println("删除出错啦");
}

}
c、配置文件:
[code]<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"default-autowire="byName">

<!--==============================利用spring利用aspectj来配置AOP================================-->

<!--声明一个业务类-->
<beanid="aspectBusiness"class="aop.schema.AspectBusiness"/>

<!--声明通知类-->
<beanid="aspectAdvice"class="aop.schema.advice.AspectAdvice"/>

<aop:config>
<aop:aspectid="businessAspect"ref="aspectAdvice">
<!--配置指定切入的对象-->
<aop:pointcutid="point_cut"expression="execution(*aop.schema.*.*(..))"/>
<!--只匹配add方法作为切入点
<aop:pointcutid="except_add"expression="execution(*aop.schema.*.add(..))"/>
-->

<!--前置通知-->
<aop:beforemethod="doBefore"pointcut-ref="point_cut"/>
<!--后置通知returning指定返回参数-->
<aop:after-returningmethod="doAfter"
pointcut-ref="point_cut"returning="result"/>
<aop:aroundmethod="doAround"pointcut-ref="point_cut"/>
<aop:after-throwingmethod="doThrow"pointcut-ref="point_cut"throwing="e"/>
</aop:aspect>
</aop:config>
</beans>

[/code]d、测试类:
[code]publicclassDebug{

publicstaticvoidmain(String[]args){
ApplicationContextcontext=newClassPathXmlApplicationContext("aop/schema_aop.xml");
AspectBusinessbusiness=(AspectBusiness)context.getBean("aspectBusiness");
business.delete("猫");
}
}
5、方式三:aspectj注解
注解在项目中已经到处都是了,撇开一些优劣不提,开发的便利性和可读性是非常的方便的。用来配置SpringAOP也非常简单便利
a、业务类:
[code]/**
*业务类
*
*/
@Component
publicclassBusiness{

/**
*切入点
*/
publicStringdelete(Stringobj){
System.out.println("==========调用切入点:"+obj+"说:你敢删除我!===========\n");
returnobj+":瞄~";
}

publicStringadd(Stringobj){
System.out.println("================这个方法不能被切。。。==============\n");
returnobj+":瞄~嘿嘿!";
}

publicStringmodify(Stringobj){
System.out.println("=================这个也设置加入切吧====================\n");
returnobj+":瞄改瞄啊!";
}

}
b、切面类:
[code]/**
*定义切面
*
*@Aspect:标记为切面类
*@Pointcut:指定匹配切点
*@Before:指定前置通知,value中指定切入点匹配
*@AfterReturning:后置通知,具有可以指定返回值
*@AfterThrowing:异常通知
*
*@authoryanbin
*
*/
@Component
@Aspect
publicclassAspectAdvice{

/**
*指定切入点匹配表达式,注意它是以方法的形式进行声明的。
*/
@Pointcut("execution(*aop.annotation.*.*(..))")
publicvoidanyMethod(){
}

/**
*前置通知
*
*@paramjp
*/
@Before(value="execution(*aop.annotation.*.*(..))")
publicvoiddoBefore(JoinPointjp){
System.out.println("===========进入beforeadvice============\n");

System.out.print("准备在"+jp.getTarget().getClass()+"对象上用");
System.out.print(jp.getSignature().getName()+"方法进行对'");
System.out.print(jp.getArgs()[0]+"'进行删除!\n\n");

System.out.println("要进入切入点方法了\n");
}

/**
*后置通知
*
*@paramjp
*连接点
*@paramresult
*返回值
*/
@AfterReturning(value="anyMethod()",returning="result")
publicvoiddoAfter(JoinPointjp,Stringresult){
System.out.println("==========进入afteradvice===========\n");
System.out.println("切入点方法执行完了\n");

System.out.print(jp.getArgs()[0]+"在");
System.out.print(jp.getTarget().getClass()+"对象上被");
System.out.print(jp.getSignature().getName()+"方法删除了");
System.out.print("只留下:"+result+"\n\n");
}

/**
*环绕通知
*
*@parampjp
*连接点
*/
@Around(value="execution(*aop.annotation.*.*(..))")
publicvoiddoAround(ProceedingJoinPointpjp)throwsThrowable{
System.out.println("===========进入around环绕方法!===========\n");

//调用目标方法之前执行的动作
System.out.println("调用方法之前:执行!\n");

//调用方法的参数
Object[]args=pjp.getArgs();
//调用的方法名
Stringmethod=pjp.getSignature().getName();
//获取目标对象
Objecttarget=pjp.getTarget();
//执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
Objectresult=pjp.proceed();

System.out.println("输出:"+args[0]+";"+method+";"+target+";"+result+"\n");
System.out.println("调用方法结束:之后执行!\n");
}

/**
*异常通知
*
*@paramjp
*@parame
*/
@AfterThrowing(value="execution(*aop.annotation.*.*(..))",throwing="e")

publicvoiddoThrow(JoinPointjp,Throwablee){
System.out.println("删除出错啦");
}

}
c、配置:




ViewCode
[code]<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"default-autowire="byName">

<context:component-scanbase-package="aop.annotation"/>
<!--打开aop注解-->
<aop:aspectj-autoproxy/>

</beans>
d、测试类:
本文借鉴http://www.cnblogs.com/yanbincn/archive/2012/08/13/2636961.html作者相当给力,写的很不错呀@这回aop可以学的明白些了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: