Spring AOP 自動建立代理

    Spring爲咱們提供了自動代理機制,讓容器爲咱們自動生成代理,把咱們從煩瑣的配置工做中解放出來,在內部,Spring 使用BeanPostProcessor自動地完成這項工做。
 

一、實現類介紹java

    這些基於BeanPostProcessor的自動代理建立器的實現類,將根據一些規則自動在容器實例化Bean時爲匹配的Bean生成代理實例。
    1)基於Bean配置名規則的自動代理建立器:容許爲一組特定配置名的Bean自動建立代理實例的代理建立器,實現類爲BeanNameAutoProxyCreator;
    2)基於Advisor匹配機制的自動代理建立器:它會對容器中全部的Advisor進行掃描,自動將這些切面應用到匹配的Bean中(即爲目標Bean建立代理實例),實現類爲DefaultAdvisorAutoProxyCreator;
    3)基於Bean中AspjectJ註解標籤的自動代理建立器:爲包含AspectJ註解的Bean自動建立代理實例,它的實現類是AnnotationAwareAspectJAutoProxyCreator,該類是Spring 2.0的新增類。
 
二、BeanNameAutoProxyCreator
Waiter業務類:
package com.yyq.aop;
 
public class Waiter {
    public void greetTo(String name) {
        System.out.println("waiter greet to " + name + ".");
    }
 
    public void serveTo(String name) {
        System.out.println("waiter serving to " + name + ".");
    }
}

 Seller業務類:spring

package com.yyq.aop;
 
public class Seller {
    public void greetTo(String name) {
        System.out.println("seller greet to " + name + ".");
    }
}

GreetingBeforeAdvice前置加強實現類:ide

package com.yyq.aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
 
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println(o.getClass().getName() + "." + method.getName());
        String clientName = (String) objects[0];
        System.out.println("Hi! Mr." + clientName + ".");
    }
}

使用Bean名進行自動代理配置:測試

<bean id="waiterTarget" class="com.yyq.aop.Waiter"/>
<bean id="sellerTarget" class="com.yyq.aop.Seller"/>
<bean id="greetingAdvice" class="com.yyq.aop.GreetingBeforeAdvice"/>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
       p:beanNames="*Target"
       p:interceptorNames="greetingAdvice"
       p:optimize="true"/>
    BeanNameAutoProxyCreator 有一個beanNames屬性,它容許用戶指定一組須要自動代理的Bean名稱,Bean名稱能夠使用 * 通配符。
測試方法:
@Test
    public void testAdvisor6(){
        String configPath = "com\\yyq\\aop\\beans.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
        Waiter waiter = (Waiter)ctx.getBean("waiterTarget");
        Seller seller = (Seller)ctx.getBean("sellerTarget");
        waiter.greetTo("Peter");
        seller.greetTo("Tom");
    }

輸出結果:spa

com.yyq.aop.Waiter.greetTo
Hi! Mr.Peter.
waiter greet to Peter.
com.yyq.aop.Seller.greetTo
Hi! Mr.Tom.
seller greet to Tom.
 
三、DefaultAdvisorAutoProxyCreator
    Advisor是切點和加強的複合體,Advisor自己已經包含了足夠的信息:橫切邏輯(要織入什麼)以及鏈接點(織入到哪裏)。DefaultAdvisorAutoProxyCreator可以掃描容器中的Advisor,並將Advisor自動織入到匹配的目標Bean中,即爲匹配的目標Bean自動建立代理。
配置:
<bean id="waiterTarget" class="com.yyq.aop.Waiter"/>
<bean id="sellerTarget" class="com.yyq.aop.Seller"/>
<bean id="greetingAdvice" class="com.yyq.aop.GreetingBeforeAdvice"/>
<bean id="regexpAdvisor2" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
          p:pattern=".*greet.*"
          p:advice-ref="greetingAdvice"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

測試方法:代理

@Test
    public void testAdvisor7(){
        String configPath = "com\\yyq\\aop\\beans.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
        Waiter waiter = (Waiter)ctx.getBean("waiterTarget");
        Seller seller = (Seller)ctx.getBean("sellerTarget");
        waiter.greetTo("Peter");
        waiter.serveTo("Peter");
        seller.greetTo("Tom");
    }
輸出結果:
com.yyq.aop.Waiter.greetTo
Hi! Mr.Peter.
waiter greet to Peter.
waiter serving to Peter.
com.yyq.aop.Seller.greetTo
Hi! Mr.Tom.
seller greet to Tom.
相關文章
相關標籤/搜索