Spring学习笔记(15)-----------Spring转折点(2)
2015-05-05 08:41
295 查看
利用方式一的配置起来,可见代码还是非常的厚重的,定义一个切面就要定义一个切面类,然而切面类中,就一个通知方法,着实没有必要。所以Spring提供了,依赖aspectj的schema配置和基于aspectj注解方式。这两种方式非常简介方便使用,也是项目中普遍的使用方式。梳理之:
4、方式二:schema配置
a、业务类:
[/code]d、测试类:
注解在项目中已经到处都是了,撇开一些优劣不提,开发的便利性和可读性是非常的方便的。用来配置SpringAOP也非常简单便利
a、业务类:
ViewCode
本文借鉴http://www.cnblogs.com/yanbincn/archive/2012/08/13/2636961.html作者相当给力,写的很不错呀@这回aop可以学的明白些了!
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{5、方式三:aspectj注解
publicstaticvoidmain(String[]args){
ApplicationContextcontext=newClassPathXmlApplicationContext("aop/schema_aop.xml");
AspectBusinessbusiness=(AspectBusiness)context.getBean("aspectBusiness");
business.delete("猫");
}
}
注解在项目中已经到处都是了,撇开一些优劣不提,开发的便利性和可读性是非常的方便的。用来配置SpringAOP也非常简单便利
a、业务类:
[code]/**b、切面类:
*业务类
*
*/
@Component
publicclassBusiness{
/**
*切入点
*/
publicStringdelete(Stringobj){
System.out.println("==========调用切入点:"+obj+"说:你敢删除我!===========\n");
returnobj+":瞄~";
}
publicStringadd(Stringobj){
System.out.println("================这个方法不能被切。。。==============\n");
returnobj+":瞄~嘿嘿!";
}
publicStringmodify(Stringobj){
System.out.println("=================这个也设置加入切吧====================\n");
returnobj+":瞄改瞄啊!";
}
}
[code]/**c、配置:
*定义切面
*
*@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("删除出错啦");
}
}
ViewCode
[code]<?xmlversion="1.0"encoding="UTF-8"?>d、测试类:
<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>
本文借鉴
相关文章推荐
- Spring学习笔记15
- spring学习笔记(15)——AOP基础
- JavaWeb学习笔记-spring-15-AOP-自动创建代理
- spring学习笔记15--Spring2.x+Hibernate3.x +Struts1.x整合开发(3)struts再次尾随sh
- 传智播客Spring视频教程学习笔记15
- Spring学习笔记(15)----使用Spring注解方式管理事务
- 【Spring学习笔记-MVC-15】Spring MVC之异常处理
- Spring 学习笔记-- <mvc:default-servlet-handler />默认加载simpleurlhandlermapping
- Spring 学习笔记
- [Java] Spring 学习笔记
- 【个人学习笔记15之--浅谈视图】
- Spring学习笔记-AOP
- HttpMessageConverter-spring(4.3.10) 学习笔记
- SCA学习之2--SCA中使用SPRING笔记
- spring_rabbitmq_amqp学习笔记
- MySQL学习笔记15:触发器
- Spring 学习笔记
- iOS学习笔记15-序列化、偏好设置和归档
- Spring学习笔记——Spring事务只对运行时异常回滚
- spring学习笔记(1) 配置spring bean的作用域 创建方法和销毁方法