使用Spring的注解方式实现AOP实例
程序员文章站
2023-12-20 11:04:10
spring对aop的实现提供了很好的支持。下面我们就使用spring的注解来完成aop做一个例子。
首先,为了使用spring的aop注解功能,必须导入如下几个包。...
spring对aop的实现提供了很好的支持。下面我们就使用spring的注解来完成aop做一个例子。
首先,为了使用spring的aop注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.然后我们写一个接口
package com.bird.service; public interface personserver { public void save(string name); public void update(string name, integer id); public string getpersonname(integer id); }
和一个接口实现类
package com.bird.service.impl; import com.bird.service.personserver; public class personservicebean implements personserver{ @override public void save(string name) { system.out.println("我是save方法"); // throw new runtimeexception(); } @override public void update(string name, integer id) { system.out.println("我是update()方法"); } @override public string getpersonname(integer id) { system.out.println("我是getpersonname()方法"); return "xxx"; } }
下面使用spring注解方式对这个bean进行方法拦截
package com.bird.service; import org.aspectj.lang.proceedingjoinpoint; import org.aspectj.lang.annotation.after; import org.aspectj.lang.annotation.afterreturning; import org.aspectj.lang.annotation.afterthrowing; import org.aspectj.lang.annotation.around; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.before; import org.aspectj.lang.annotation.pointcut; /** * 切面 * @author bird * */ @aspect public class myinterceptor { @pointcut("execution(* com.bird.service.impl.personservicebean.*(..))") private void anymethod(){}//定义一个切入点 @before("anymethod() && args(name)") public void doaccesscheck(string name){ system.out.println(name); system.out.println("前置通知"); } @afterreturning("anymethod()") public void doafter(){ system.out.println("后置通知"); } @after("anymethod()") public void after(){ system.out.println("最终通知"); } @afterthrowing("anymethod()") public void doafterthrow(){ system.out.println("例外通知"); } @around("anymethod()") public object dobasicprofiling(proceedingjoinpoint pjp) throws throwable{ system.out.println("进入环绕通知"); object object = pjp.proceed();//执行该方法 system.out.println("退出方法"); return object; } }
@pointcut("execution(* com.bird.service.impl.personservicebean.*(..))")
这句话是方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包。(..)代表各种方法。然后下面的注解就比较简单了,就是在使用方法前和中,还有环绕拦截/,然后在spring的配置文件中继续配置bean,需要打开aop命名空间
<?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: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"> <aop:aspectj-autoproxy/> <bean id="personservicebean" class="com.bird.service.impl.personservicebean"/> <bean id="myinterceptor" class="com.bird.service.myinterceptor"/> </beans>
然后建立一个junit测试
package junit.test; import org.junit.test; import org.springframework.context.applicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; import com.bird.service.personserver; public class springaoptest { @test public void inteceptortest(){ applicationcontext ctx = new classpathxmlapplicationcontext("beanaop.xml"); personserver bean = (personserver)ctx.getbean("personservicebean"); bean.save(null); } }
测试结果为
2012-3-12 18:08:39 org.springframework.context.support.abstractapplicationcontext preparerefresh 信息: refreshing org.springframework.context.support.classpathxmlapplicationcontext@dd20f6: display name [org.springframework.context.support.classpathxmlapplicationcontext@dd20f6]; startup date [mon mar 12 18:08:39 cst 2012]; root of context hierarchy 2012-3-12 18:08:40 org.springframework.beans.factory.xml.xmlbeandefinitionreader loadbeandefinitions 信息: loading xml bean definitions from class path resource [beanaop.xml] 2012-3-12 18:08:40 org.springframework.context.support.abstractapplicationcontext obtainfreshbeanfactory 信息: bean factory for application context [org.springframework.context.support.classpathxmlapplicationcontext@dd20f6]: org.springframework.beans.factory.support.defaultlistablebeanfactory@b0bad7 2012-3-12 18:08:40 org.springframework.beans.factory.support.defaultlistablebeanfactory preinstantiatesingletons 信息: pre-instantiating singletons in org.springframework.beans.factory.support.defaultlistablebeanfactory@b0bad7: defining beans [org.springframework.aop.config.internalautoproxycreator,personservicebean,myinterceptor]; root of factory hierarchy null 前置通知 进入环绕通知 我是save方法 后置通知 退出方法 最终通知
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。