本例使用的是Spring2.5
1.Aop配置文件spring-aop.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean id="helloWorldServiceImpl" class="com.spring.bijian.aop.HelloWorldServiceImpl"> </bean> <bean id="aspect" class="com.spring.bijian.aop.HelloWorldAspect"> </bean> <aop:config> <aop:pointcut id="pointcut" expression="execution(* com.spring..*.sayHello(..)) and args(user)"/> <aop:aspect ref="aspect"> <aop:before pointcut-ref="pointcut" method="beforeAdvice(java.lang.String)" arg-names="user"/> <aop:after pointcut="execution(* com.spring..*.sayHello(..))" method="afterAdvice"/> <aop:after-returning pointcut="execution(* com.spring..*.sayAfterReturning(..))" method="afterReturningAdvice" arg-names="value" returning="value"/> <aop:after-throwing pointcut="execution(* com.spring..*.sayAfterThrowing(..))" method="afterThrowingAdvice" arg-names="e" throwing="e"/> <aop:around pointcut="execution(* com.spring..*.sayAround(..))" method="aroundAdvice"/> </aop:aspect> </aop:config> </beans>
2.HelloWorldService接口
package com.spring.bijian.aop; public interface HelloWorldService { public void sayHello(String username); public boolean sayAfterReturning(); public void sayAfterThrowing(); public int sayAround(String username,String password); }
3.HelloWorldServiceImpl类
package com.spring.bijian.aop; import java.lang.RuntimeException; public class HelloWorldServiceImpl implements HelloWorldService { public void sayHello(String username) { System.out.println("My first Aop test " + username); } public boolean sayAfterReturning() { System.out.println("after returning"); return true; } public void sayAfterThrowing() { System.out.println("After throwing"); throw new RuntimeException(); } public int sayAround(String username, String password) { System.out.println("Around username:" + username + ",password:" + password); int val = 1; return val; } }
4.具体实现AOP编程的HelloWorldAspect类
package com.spring.bijian.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class HelloWorldAspect { public void beforeAdvice(String user){ //System.out.println(jp.getArgs()[0].toString()); System.out.println("before advice " + user); } public void afterAdvice(JoinPoint jp){ System.out.println("after advice "+jp.getArgs()[0].toString()); } public void afterReturningAdvice(Object value){ System.out.println("afterReturning advice "+value); } public void afterThrowingAdvice(Exception e){ System.out.println("after throwing advice exception:" + e); } public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{ /**System.out.println(pjp.toLongString()); System.out.println(pjp.getSignature().toString()); System.out.println(pjp.getKind().toString()); System.out.println(pjp.getArgs()[0].toString()); System.out.println("name+psd");*/ Object [] obj = pjp.getArgs(); String username = (String) obj[0]; String password = (String) obj[1]; System.out.println(username+","+password); Object retVal; if(username.equals("bijian") && password.equals("color")){ retVal = pjp.proceed(); }else{ retVal = pjp.proceed(new Object[]{"ideal","*******"}); } System.out.println("name+password"); if(retVal == null) System.out.println("false"); else{ System.out.println(retVal.toString()); } return 2; } }
5.测试类
package com.spring.bijian.aop; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AopTest { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "com/spring/bijian/aop/spring-aop.xml"); HelloWorldService hello = (HelloWorldService) context .getBean("helloWorldServiceImpl"); hello.sayHello("bijian"); // System.out.println("==================================="); // hello.sayAfterReturning(); // System.out.println("==================================="); // hello.sayAfterThrowing(); System.out.println("==================================="); Object val = (Object) hello.sayAround("bijian", "colo"); System.out.println(val.toString()); } }
运行结果:
before advice bijian My first Aop test bijian after advice bijian =================================== bijian,colo Around username:ideal,password:******* name+password 1 2
6.AOP Around(环绕通知)可以控制返回对象,即你可以返回一个与目标对象完全不同的返回值,虽然这很危险,但是你却可以办到。目标方法的返回值 就是 环绕通知的返回值。proceed() 方法可以在通知体内调用一次、多次 或根本不用调用;还可以控制执行方法的参数值。具体见aroundAdvice方法的实现。
这里使用AOP Around就可以用来进行一个身份验证,通过面向切面编程(AOP)将验证部分独立出来,使得代码的耦合度降低,如果使用面向对象思想(OOP)就应该是独立写一个身份验证的方法,然后当需要使用该方法再去new 一个身份验证方法的类,然后传递参数通过验证类中的方法去验证,这样代码的耦合度就变强了。
文章来源:http://blog.csdn.net/acceptedxukai/article/details/7784986
相关推荐
Spring AOP之基于Schema配置总结与案例 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45242505
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
Spring AOP(面向切面编程)是Java高级编程中的重要...Spring AOP的配置方式多样,包括基于接口的配置、schema-based配置和@AspectJ注解配置。通过这些配置方式,开发者可以灵活地实现AOP功能,满足不同场景下的需求。
声明规则属性设置(来源于 Spring AOP Schema 类型 basicAdviceType)pointcut: Pointcut 表达式内容pointc
NULL 博文链接:https://snowolf.iteye.com/blog/236264
主要介绍了Spring AOP的实现原理详解及实例的相关资料,需要的朋友可以参考下
NULL 博文链接:https://quicker.iteye.com/blog/673889
Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop] Offending resource: class path resource [beans.xml] at org....
Spring2.5和Hibernate3集成 采用声明式事务 1.声明式事务的配置 * 配置sessionFactory ... 2.http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <context:component-scan base-package="com.spring.*"/> <aop:config> <aop:aspect id="aspect" ref="logIntercepter"> <aop:pointcut ...
第三种实现方法—通过注解... http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="userService" class="cn.sxt.service.impl.UserServiceImpl"></bean> <aop:aspectj-autoproxy/> </beans>
<beans xmlns:aop=http://www.springframework.org/schema/aop...> <!--启动支持--> <aop> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@AspectJ注解的支持 <bean class=...
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> ============================================= 解决整合问题: 1、Spring 3.x 对 Hibernate 4.x 不提供 HibernateDaoSupport,所以在dao的实现...
在使用Spring,写核心配置文件的时候都引入了不一样的约束,这里总结关于spring的XML约束+Schema约束。以后不管是仅使用ioc功能还是aop,把全部的约束引入即可。至于说如何找到这些约束的代码的过程,也在这个文档...
<?xml version="1.0" encoding="UTF-8"?><beansxmlns=...aop-2.5.xsd">
NULL 博文链接:https://wangxinchun.iteye.com/blog/2074483
Spring AOP:以loC为基础讲解Spring下的AOP开发,讲解了3种AOP的开发方式,即使用@Aspect注释符、基于Schema的配置的开发方式和Spring API的开发方式,最后在实际的Java EE项目中实现5种Spring AOP功能(日志记录器...
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <!-- 配置视图...