你的位置:首页 > Java教程

[Java教程]Spring(六)AOP切入方式


一、接口切入方式

实现类

package com.pb.entity;/** * 实体类 */public class Hello {  private String name;  private String password;    public void show(){    System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  }

1.1、前置增强

 

package com.pb.aop;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;/** * 前置增强的Bean * @author Administrator *实现MethodBeforeAdvice接口 */public class BeforeAdded implements MethodBeforeAdvice {  @Override  public void before(Method arg0, Object[] arg1, Object arg2)      throws Throwable {    System.out.println("====前置增强!=====");  }}

applicationContext.

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!--hello Bean --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/><!--切入的Bean --><bean id="beforeAdd" class="com.pb.aop.BeforeAdded"/><!--前置增强切入的Bean --><aop:config><!-- 切入点 --><aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/><!-- 关联切入类和切入点 --><aop:advisor advice-ref="beforeAdd" pointcut-ref="myPoint"/></aop:config></beans>

 

1.2、后置增强

package com.pb.aop;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;/** * 后置增强 */public class AfterAdded implements AfterReturningAdvice {  @Override  public void afterReturning(Object arg0, Method arg1, Object[] arg2,      Object arg3) throws Throwable {    System.out.println("====这里是后置增强!====");  }}

 

 applicationContext.

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!--hello Bean --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/><!--切入的Bean --><!--后置增强切入的Bean --><bean id="afterAdd" class="com.pb.aop.AfterAdded"/><aop:config><!-- 切入点 --><aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/><!-- 关联后置增强切入类和切入点 --><aop:advisor advice-ref="afterAdd" pointcut-ref="myPoint"/></aop:config><!--后置增强切入的Bean --></beans>

 

1.3、异常增强

实体类中增加异常

package com.pb.entity;/** * 实体类 */public class Hello {  private String name;  private String password;    public void show(){    System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());    //加入异常    System.out.println(1/0);  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  }

 

package com.pb.aop;import java.lang.reflect.Method;import org.springframework.aop.ThrowsAdvice;/** * 异常增强类 * @author Administrator * */public class ThrowingAdded implements ThrowsAdvice {  //第一种写法  public void afterThrowing(Exception ex){    System.out.println("我是异常增强!,,没处理异常,有问题就找我");      }  //第二种写法  public void afterThrowing(Method arg0, Object[] arg1, Object arg2,Exception ex){    System.out.println("我是异常增强!,,没处理异常,有问题就找我");      }}

 

 applicationContext.

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!--hello Bean --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/><!--切入的Bean --><!--异常增强切入的Bean --><bean id="throwAdd" class="com.pb.aop.ThrowingAdded"/><aop:config><!-- 切入点 --><aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/><!-- 关联异常增强切入类和切入点 --><aop:advisor advice-ref="throwAdd" pointcut-ref="myPoint"/></aop:config></beans>

1.4、以上综合

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!--hello Bean --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/><!--切入的Bean --><!--前置增强切入的Bean --><bean id="beforeAdd" class="com.pb.aop.BeforeAdded"/><!--后置增强切入的Bean --><bean id="afterAdd" class="com.pb.aop.AfterAdded"/><!--异常增强切入的Bean --><bean id="throwAdd" class="com.pb.aop.ThrowingAdded"/><aop:config><!-- 切入点 --><aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/><!-- 关联前置增强切入类和切入点 --><aop:advisor advice-ref="beforeAdd" pointcut-ref="myPoint"/><!-- 关联后置增强切入类和切入点 --><aop:advisor advice-ref="afterAdd" pointcut-ref="myPoint"/><!-- 关联异常增强切入类和切入点 --><aop:advisor advice-ref="throwAdd" pointcut-ref="myPoint"/></aop:config></beans>

 

1.5、环绕增强

 

package com.pb.entity;/** * 实体类 */public class Hello {  private String name;  private String password;    public void show(){    System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());    //加入异常    System.out.println(1/0);  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  }

环绕增加Bean

package com.pb.aop;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;/** * 环绕增强 * @author Administrator *实现接口MethodIntercepor */public class AroundAdded implements MethodInterceptor {  @Override  public Object invoke(MethodInvocation arg0) throws Throwable {    Object result=null;    try {      System.out.println("环绕增强开始!");       result=arg0.proceed();      System.out.println("环绕增强结束!");    } catch (Exception e) {      System.out.println("环绕增强异常!");    }finally{      System.out.println("环绕增强最终增强!");    }        return result;  }}

 

 applicationContext.

 

<??><beans ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/ ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">  <!-- 关联Bean Hello --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="qewr"/><!--环绕增强的Bean --><bean id="aroundAdded" class="com.pb.aop.AroundAdded"></bean><aop:config><!-- 切入点--><aop:pointcut expression="execution(* com.pb.entity.*.*(..))" id="myPoint"/><!--关联切入点 --><aop:advisor advice-ref="aroundAdded" pointcut-ref="myPoint"/></aop:config></beans>

 

二、注解方式

 

package com.pb.entity;/** * 实体类 */public class Hello {  private String name;  private String password;    public void show(){    System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());    //加入异常    System.out.println(1/0);  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  }

aop的类

package com.pb.aop;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;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;/** * 注解的方式现实AOP * @author Administrator * */@Aspectpublic class MyAnnotionAOP {    /*   * 前置   */  @Before(value="execution(* com.pb.entity.*.*(..))")  public void before(JoinPoint point){        System.out.println("前置增强");    System.out.println(point.getClass());  }  /*   * 后置   */  @AfterReturning(value="execution(* com.pb.entity.*.*(..))")  public void after(JoinPoint point){    System.out.println("后置增强");    //参数个数    System.out.println(point.getArgs().length);  }  /*   *异常   */  @AfterThrowing(value="execution(* com.pb.entity.*.*(..))")  public void afterThrowing(JoinPoint point){    System.out.println("我是异常增强");    System.out.println(point.getSignature().getName());  }  /**   * 环绕   */  @Around(value="execution(* com.pb.entity.*.*(..))")  public Object myAround(ProceedingJoinPoint point){    Object result=null;        try {      System.out.println("环绕增强开始了");      System.out.println(point.getKind()+point.getArgs());      point.proceed();      System.out.println("环绕增强后置增强了");      System.out.println(point.getTarget()+""+point.getClass());    } catch (Throwable e) {      System.out.println("环绕增强,异常增强处理");      e.printStackTrace();    }finally{      System.out.println("环绕增强最终增强");    }        return result;      }}

applicationContext.

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!-- 关联Bean Hello --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="qewr"/><!-- 切入 类 --><bean id="myAnnAOP" class="com.pb.aop.MyAnnotionAOP" /><!--开启自动代理 --><aop:aspectj-autoproxy/></beans>

三、Schema方式(推荐)

 Hello类同上

package com.pb.entity;/** * 实体类 */public class Hello {  private String name;  private String password;    public void show(){    System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());    //加入异常    System.out.println(1/0);  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  }

aop类

package com.pb.aop;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;/** * SCHEMA方式切入类 * * @author Administrator * */public class MySchemaAOP {  /**   * 前置切入 可以有参数但是固定写法   */  public void before(JoinPoint point){    System.out.println("这里是前置增强切入");    System.out.println(point.getKind()+point.getArgs().toString());  }  /**   * 后置切入   */  public void after(JoinPoint point){    System.out.println("这里是后置增强切入");    System.out.println(point.getTarget()+point.getSignature().getName());  }  /**   * 异常切入   */  public void myException(JoinPoint point){    System.out.println("这里是异常增强切入");    System.out.println(point.getSourceLocation());  }  /**   * 环绕增强切入   */  public Object myAround(ProceedingJoinPoint point){    Object resut=null;    try {      System.out.println("环绕增强---前置增强");      resut=point.proceed();      System.out.println("环绕增强---后置增强");    } catch (Throwable e) {      System.out.println("环绕增强---异常增强");      e.printStackTrace();    }finally{      System.out.println("环绕增强---最终增强");    }    return resut;  }}

applicationContext.

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="http://www.springframework.org/schema/p"  ="http://www.springframework.org/schema/aop"  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"><!-- 关联Bean Hello --><bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="qewr"/><!-- 切入 类 --><bean id="mySchemaAOP" class="com.pb.aop.MySchemaAOP"/><aop:config><!-- 切入点--><aop:pointcut expression="execution(* com.pb.entity.*.*(..))" id="myPoint"/><!--关联切入类、方法和切入点 --><aop:aspect ref="mySchemaAOP"><!-- 切入 前置方法和切入点--><aop:before method="before" pointcut-ref="myPoint"/><!-- 切入 后置方法和切入点--><aop:after method="after" pointcut-ref="myPoint"/><!-- 切入 异常方法和切入点--><aop:after method="myException" pointcut-ref="myPoint"/><!-- 切入 环绕增加方法和切入点--><aop:around method="myAround" pointcut-ref="myPoint"/></aop:aspect></aop:config></beans>