当前位置: 移动技术网 > IT编程>开发语言>Java > 使用Spring的注解方式实现AOP实例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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方法 
后置通知 
退出方法 
最终通知 

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网