Spring AOP四种实现方式

Spring AOP四种实现方式

1. 经典的基于代理的AOP

  1. 创建通知:定义一个接口

public interface Sleepable{
 
    void sleep();
}
然后写一个Human类,他实现了这个接口


public Human implements Sleepable{
 
  public void sleep(){
      System.out.println("睡觉中...!");
  }

}

2.编写一个SleepHelper类,它里面包含了睡觉的辅助工作,用AOP术语来说它就应该是通知

public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice  {

public void before(Method method, Object[] arguments, Object target)
            throws Throwable {
        System.out.println("睡觉前");
       
    }

public void afterReturning(Object rturnValue, Method method, Object[] arguments,
            Object target) throws Throwable {
        System.out.println("睡觉后");
       
    }

}

然后在spring配置文件中进行配置:

<!-- 被代理目标对象 -->

<bean></bean>

<bean></bean>
//定义切点的常用的两种方式:1)使用正则表达式 2)使用AspectJ表达式,
//这里用正则表达式

<!-- 顾问 -->
    <bean>
     
        <property ref="BeforAdvice"></property>
      <property value=".*l.*g.*"></property>
      </bean>

<!-- 代理对象 -->
// ProxyFactoryBean是一个代理,我们可以把它转换为
//proxyInterfaces中指定的实现该interface的代理对象
      <bean>
     
        <property ref="Human"></property>
      <property value="BeforAdvisor"></property>
      </bean>

代理类

public class StuTest {
    public static void main(String[] args) {
        //通过ClassPathXmlApplicationContext实例化Spring的上下文
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过ApplicationContext的getBean()方法,根据id来获取Bean的实例
        Sleepable s=(Sleepable)context.getBean("Human");
        s.sleep();
    }
}

3、使用AspectJ的注解

用@Aspect的注解来标识切面

@Aspect//该类为切面
public class MyAspect {
    @Before(value="execution(public * *(..))")
 public void mybefore(){
   
        System.out.println("前置增强");
 }
    //后置增强
    @AfterReturning(value="execution(public * *(..))")
    public void myafterReturning(){
       
            System.out.println("后置增强");
    }
   
    //异常增强
        @AfterThrowing(value="execution(public * *(..))")
        public void myafterThrowing(){
           
                System.out.println("异常增强");
        }
       
        //环绕增强
        @Around(value="execution(public * *(..))")
        public void myAround(ProceedingJoinPoint jp){
            System.out.println("环绕前增强");
                try {
                    jp.proceed();
                } catch (Throwable e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("环绕后增强");
               
        }
       
        //最终增强
                @After(value="execution(public * *(..))")
                public void myafterLogger(){
                   
                        System.out.println("最终增强");
                }
}

Spring配置文件:

<!-- 目标对象 -->
  <bean></bean>

<!-- 切面: -->
  <bean></bean>
 
  <aop:aspectj-autoproxy/>

测试类

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4179ac9b828aa429b4be3655399705c1.html