Spring--AOP--三种写法

原文网址:Spring--AOP--三种写法_IT利刃出鞘的博客-CSDN博客

简介

        本文介绍Spring的AOP的三种写法。

概述

        Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 。 具体是使用 BeanPostProcessor 来实现这项功能。

这三种自动代理创建器如下:

类型 实现类
基于 Bean 中的 AspectJ 注解标签的匹配规则 AnnotationAwareAspectJAutoProxyCreator
基于 Bean 名字匹配规则 BeanNameAutoProxyCreator
基于 Advisor 匹配规则 DefaultAdvisorAutoProxyCreator

第一种:基于注解标签(最常用)

AnnotationAwareAspectJAutoProxyCreator

Waiter类:

package aop.beannameauto;
 
public class Waiter {
    public void greet(String name) {
        System.out.println("Waiter.greet()"+name);
    }
}

增强类:

package aop.aspect;
 
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
 
@Aspect
public class GreetB {
 
    @Before("execution(* greet(..))")
    public void before() {
        System.out.println("GreetB.before()");
    }
}

        在类处标注了@AspectJ注解,第三方处理程序就可以通过类是否拥有@AspectJ注解判断是否为一个切面

        其次,在方法定义出标注了@Before注解,并为该注解提供了成员值"execution(* greet(..))",提供了两个信息:@Before表示前置增强,成员值是一个@AspectJ切点表达式,意思在目标类的greet方法上织入增强。

测试类:

package aop.aspect;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;
 
public class AspectTest {
 
    @Test
    public void test() {
        Waiter waiter = new Waiter();
        AspectJProxyFactory factory = new AspectJProxyFactory();
        factory.setTarget(waiter);
        factory.addAspect(GreetB.class);
        Waiter waiter2 = factory.getProxy();
        waiter2.greet("11");
    }

}

第二种:基于Bean 名字

BeanNameAutoProxyCreator

Waiter类:

package aop.beannameauto;
 
public class Waiter {
    public void greet(String name) {
        System.out.println("Waiter.greet()"+name);
    }
}

前置方法增强:

package aop.beannameauto;
 
import java.lang.reflect.Method;
 
import org.springframework.aop.MethodBeforeAdvice;
 
public class GreetB implements MethodBeforeAdvice{
 
    @Override
    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        // TODO Auto-generated method stub
        String name= (String) arg1[0];
        System.out.println("GreetB.before()"+name);
    }
    
}

XML配置文件:

<?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:p="http://www.springframework.org/schema/p"
    xmlns:aop="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 id="waiter" class="aop.beannameauto.Waiter" />
    <bean id="greetingAdvice" class="aop.beannameauto.GreetB" />
           
    <bean
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
        p:beanNames="*er" 
        p:interceptorNames="greetingAdvice"
        p:optimize="true"
    />
</beans>
  • target:代理的目标类
  • beanNames:需要代理的bean的列表
  • interceptorNames:需要应用到目标对象上的通知Bean的名字.可以是拦截器,advisor和其他通知类型的名字
  • optimize 设置为 true,则表示使用 CGLib 动态代理技术。 

测试类:

package aop.beannameauto;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class BeanTest {
    
    @Test
    public void test() {
            ApplicationContext context = new ClassPathXmlApplicationContext("aop/beannameauto/beans.xml");
            Waiter waiter = (Waiter) context.getBean("waiter");
            waiter.greet("11");
            
    }
 
}

第三种:基于 Advisor 

DefaultAdvisorAutoProxyCreator

Waiter类:

package aop.beannameauto;
 
public class Waiter {
    public void greet(String name) {
        System.out.println("Waiter.greet()"+name);
    }
}

前置方法增强:

package aop.beannameauto;
 
import java.lang.reflect.Method;
 
import org.springframework.aop.MethodBeforeAdvice;
 
public class GreetB implements MethodBeforeAdvice{
 
    @Override
    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        // TODO Auto-generated method stub
        String name= (String) arg1[0];
        System.out.println("GreetB.before()"+name);
        
    }
    
}

配置文件:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
    
    <bean id="waiter" class="aop.defaultauto.Waiter" />
    <bean id="greetingAdvice" class="aop.defaultauto.GreetB" />
    <bean id="regexpAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
        p:patterns=".*greet.*" p:advice-ref="greetingAdvice" />
    <bean
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
 
</beans>

测试类:

package aop.defaultauto;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class BeanTest {
 
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("aop/defaultauto/beans.xml");
        Waiter waiter = (Waiter) context.getBean("waiter");
        waiter.greet("11");
    }
 
}

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/125522322