欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Spring的注解方式实现AOP实例

程序员文章站 2024-02-15 10:21: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方法 
后置通知 
退出方法 
最终通知 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。